政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(三){Plot全工作流程展示}·{Python语言}

Matplotlib入门:从数据到定制可视化全过程
本文详细介绍了如何使用Matplotlib进行数据可视化,包括从原始数据开始,通过显式和隐式接口创建图表,调整样式,个性化图例,以及最终保存图表的过程。

本文旨在展示使用Matplotlib进行可视化的开始、中间和结束过程。

我们将从一些原始数据开始,并最终保存一个自定义可视化的图表,在这个过程中,我们尝试突出一些使用Matplotlib的有趣特性和最佳实践。

刚看到这篇文章的小伙伴,可以看一下我这个演绎系列的前两篇文章,准备一下环境等等:

政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(一){Pyplot tutorial}icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136096870政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(二){Image tutorial}·{Python语言}icon-default.png?t=N7T8https://blog.csdn.net/snowdenkeke/article/details/136100806

小伙伴们准备好环境咱们这就开始吧。


关于显式接口与隐式接口的注释

Matplotlib有两个接口

关于显式和隐式接口之间的权衡解释,请参见Matplotlib应用接口(APIs)。

在显式面向对象(OO)接口中,我们直接使用axes.Axes的实例来在figure.Figure的实例中建立可视化。在隐式接口中,受到和模仿MATLAB的启发,我们使用了一个基于全局状态的接口,该接口封装在pyplot模块中,以绘制到“当前Axes”。

咱们要记住的是:

图形(Figure)是最终的图像,可以包含一个或多个坐标轴(Axes)。

坐标轴(Axes)表示一个单独的绘图(不要与坐标轴(Axis)混淆,坐标轴指的是绘图的x轴、y轴或z轴)。

我们从坐标轴(Axes)直接调用绘图方法,这样可以在自定义绘图时提供更多的灵活性和功能。

通常情况下,绘图时使用显式接口而不是隐式的pyplot接口。

看一下咱们的数据

咱们将使用一些收集的数据。

import matplotlib.pyplot as plt
import numpy as np

data = {'Barton LLC': 109438.50,
        'Frami, Hills and Schmidt': 103569.59,
        'Fritsch, Russel and Anderson': 112214.71,
        'Jerde-Hilpert': 112591.43,
        'Keeling LLC': 100934.30,
        'Koepp Ltd': 103660.54,
        'Kulas Inc': 137351.96,
        'Trantow-Barrows': 123381.38,
        'White-Trantow': 135841.99,
        'Will LLC': 104437.60}
group_data = list(data.values())
group_names = list(data.keys())
group_mean = np.mean(group_data)

现在开始

这些数据自然地可以用条形图进行可视化,每个组都有一个条形。

为了使用面向对象的方法来实现这个,我们首先生成一个 figure.Figure 和 axes.Axes 的实例,Figure 就像一块画布,而 Axes 则是画布上的一部分,我们将在上面进行特定的可视化。

图表上可以有多个轴。

fig, ax = plt.subplots()

我的演绎:

现在我们有了一个Axes实例,我们可以在其上进行绘图:

fig, ax = plt.subplots()
ax.barh(group_names, group_data)

我的演绎:

控制风格

在Matplotlib中有许多可用的样式,以便您根据需求自定义可视化,要查看样式列表,我们可以使用style。

print(plt.style.available)

我的演绎:

您可以使用以下方法激活样式:

plt.style.use('fivethirtyeight')

现在让我们重新打造上述情节,看看它的样子:

fig, ax = plt.subplots()
ax.barh(group_names, group_data)

它指的是样式控制很多东西,比如颜色、线宽、背景等等。

个性化Plot

现在我们有了一个外观上看起来不错的图表,所以让我们对其进行微调,使其准备好进行打印。

首先让我们旋转x轴上的标签,以便它们更清晰地显示出来。

我们可以通过使用axes.Axes.get_xticklabels()方法来访问这些标签。

fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()

如果我们想要一次设置多个项目的属性,使用pyplot.setp()函数非常有用,它将接受一个Matplotlib对象的列表(或多个列表),并尝试设置每个对象的某些样式元素。

fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

我的演绎:

看起来底部的一些标签被裁掉了。

我们可以告诉Matplotlib自动为我们创建的图形留出空间,为此,我们将rcParams的autolayout值设置为True。想要了解有关使用rcParams自定义Matplotlib样式、布局和其他特性的更多信息,请参阅使用样式表和rcParams自定义Matplotlib。

plt.rcParams.update({'figure.autolayout': True})

fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

接下来,我们给图表添加标签,使用面向对象的接口进行操作时,可以使用Artist.set()方法来设置此Axes对象的属性。

fig, ax = plt.subplots()
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')

我的演绎:

我们还可以使用pyplot.subplots()函数调整此图的大小,我们可以通过figsize关键字参数来实现。

值得注意的是:

在NumPy中,索引的形式是(行,列),而figsize关键字参数的形式是(宽度,高度),这符合可视化的惯例,不幸的是这些惯例与线性代数的惯例不同。

fig, ax = plt.subplots(figsize=(8, 4))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')
ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')

对于标签,我们可以以函数的形式指定自定义的格式化规则。

下面我们定义一个函数,它以整数作为输入,返回一个字符串作为输出。当与Axis.set_major_formatter或Axis.set_minor_formatter一起使用时,它们会自动创建并使用一个ticker.FuncFormatter类。

对于这个函数,x参数是原始的刻度标签,pos是刻度位置,在这里我们只使用x,但两个参数都是必需的:

def currency(x, pos):
    """The two arguments are the value and tick position"""
    if x >= 1e6:
        s = f'${x*1e-6:1.1f}M'
    else:
        s = f'${x*1e-3:1.0f}K'
    return s

然后,我们可以将这个函数应用于我们绘图的标签上,为此,我们使用我们的坐标轴的 xaxis 属性,这使得您可以在我们的绘图中对特定轴执行操作。

fig, ax = plt.subplots(figsize=(6, 8))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')
ax.xaxis.set_major_formatter(currency)

组合多个可视化

可以在同一个axes.Axes实例上绘制多个图形元素,要实现这一点,我们只需要在该axes对象上调用另一个绘图方法。

fig, ax = plt.subplots(figsize=(8, 8))
ax.barh(group_names, group_data)
labels = ax.get_xticklabels()
plt.setp(labels, rotation=45, horizontalalignment='right')

# Add a vertical line, here we set the style in the function call
ax.axvline(group_mean, ls='--', color='r')

# Annotate new companies
for group in [3, 5, 8]:
    ax.text(145000, group, "New Company", fontsize=10,
            verticalalignment="center")

# Now we move our title up since it's getting a little cramped
ax.title.set(y=1.05)

ax.set(xlim=[-10000, 140000], xlabel='Total Revenue', ylabel='Company',
       title='Company Revenue')
ax.xaxis.set_major_formatter(currency)
ax.set_xticks([0, 25e3, 50e3, 75e3, 100e3, 125e3])
fig.subplots_adjust(right=.1)

plt.show()

保存咱们的Plot

现在我们对我们的图表结果感到满意,我们想将其保存到磁盘中,在Matplotlib中,有许多可以保存的文件格式。

要查看可用选项的列表,请使用:

print(fig.canvas.get_supported_filetypes())

我们可以使用figure.Figure.savefig()将图保存到硬盘上。

请注意,下面展示了几个有用的标志:

transparent=True可以使保存的图的背景透明(如果格式支持的话)。

dpi=80控制输出的分辨率(每平方英寸的点数)。

bbox_inches="tight"使图的边界适应我们的绘图。

# Uncomment this line to save the figure.
# fig.savefig('sales.png', transparent=False, dpi=80, bbox_inches="tight")

好啦,咱们这样就完成了整套流程。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

政安晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值