本文旨在展示使用Matplotlib进行可视化的开始、中间和结束过程。
我们将从一些原始数据开始,并最终保存一个自定义可视化的图表,在这个过程中,我们尝试突出一些使用Matplotlib的有趣特性和最佳实践。
刚看到这篇文章的小伙伴,可以看一下我这个演绎系列的前两篇文章,准备一下环境等等:
政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(一){Pyplot tutorial}
https://blog.csdn.net/snowdenkeke/article/details/136096870政安晨:在Jupyter中【示例演绎】Matplotlib的官方指南(二){Image tutorial}·{Python语言}
https://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")
好啦,咱们这样就完成了整套流程。
Matplotlib入门:从数据到定制可视化全过程
本文详细介绍了如何使用Matplotlib进行数据可视化,包括从原始数据开始,通过显式和隐式接口创建图表,调整样式,个性化图例,以及最终保存图表的过程。
1625

被折叠的 条评论
为什么被折叠?



