Matplotlib绘图生命周期

本教程旨在使用Matplotlib显示单个可视化的开始,中间和结尾。我们将从一些原始数据开始,最后保存一个自定义可视化图形。在此过程中,我们将尝试使用Matplotlib突出一些简洁的功能和最佳实践。

面向对象的API与Pyplot

Matplotlib有两个接口。第一个是面向对象(OO)接口。在这种情况下,我们利用axes.Axes的实例来渲染图形实例的可视化。

第二种是基于MATLAB并使用基于状态的接口,它封装在pyplot模块中。请参阅pyplot教程,以深入了解pyplot接口。

大多数术语都很简单,但要记住的主要是:

  • Figure是可能包含1个或更多轴的最终图像。
  • Axes代表一个单独的图(不要将其与“axis”这个词混淆,后者指的是图的x/y轴)。

直接调用从Axes进行绘图的方法,这使我们在定制绘图方面具有更大的灵活性和强大功能。

注意 - 通常,尝试在pyplot接口上使用面向对象的接口。

下面数据它包含许多公司的销售信息。

# sphinx_gallery_thumbnail_number = 10
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

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.Figureaxes.Axes的实例。Figure就像一个画布,Axes是画布的一部分,下面我们将在它上面进行特定的可视化。

fig, ax = plt.subplots()

现在有了一个Axes实例,然后就可以在它上面进行绘图。

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

Axes实例

控制样式

Matplotlib中有许多样式可根据需要定制可视化。要查看样式列表,可以使用pyplot.style

print(plt.style.available)

输出结果如下 -

['seaborn-ticks', 'ggplot', 'dark_background', 'bmh', 'seaborn-poster', 'seaborn-notebook', 'fast', 'seaborn', 'classic', 'Solarize_Light2', 'seaborn-dark', 'seaborn-pastel', 'seaborn-muted', '_classic_test', 'seaborn-paper', 'seaborn-colorblind', 'seaborn-bright', 'seaborn-talk', 'seaborn-dark-palette', 'tableau-colorblind10', 'seaborn-darkgrid', 'seaborn-whitegrid', 'fivethirtyeight', 'grayscale', 'seaborn-white', 'seaborn-deep']

可以使用以下内容激活样式:

plt.style.use('fivethirtyeight')

现在重新制作上面的绘图,看看它输出的样子:

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

样式控制很多东西,比如颜色,线宽,背景等。

自定义绘图

现在已经得到了一个想要的一般外观的绘图,下面对它进行微调,以便它可以打印出来。首先旋转x轴上的标签,使它们更清晰地显示出来。可以使用axes.Axes.get_xticklabels()方法访问这些标签:

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

旋转`x`轴上的标签

如果想一次设置多个项的属性,那么可使用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自动创建的图中的元素腾出空间。为此,设置rcParamsautolayout值。

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')

autolayout值

接下来,为绘图添加标签。要使用OO接口执行此操作,可以使用axes.Axes.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')

设置Axes对象的属性

还可以使用pyplot.subplots()函数调整此图的大小。可以用figsize kwarg做到这一点。

虽然NumPy中的索引遵循形式(行,列),但figsize kwarg遵循形式(宽度,高度)。它遵循可视化中的惯例,遗憾的是它们与线性代数的惯例不同。

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')

惯例

对于标签,可以使用ticker.FuncFormatter类以函数的形式指定自定义格式。下面将定义一个以整数作为输入的函数,并返回一个字符串作为输出。

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

formatter = FuncFormatter(currency)

然后可以将此格式化程序应用于绘图上的标签。为此将使用轴的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(formatter)

绘图上指定轴

结合多个可视化

可以在同一轴的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'll 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(formatter)
ax.set_xticks([0, 25e3, 50e3, 75e3, 100e3, 125e3])
fig.subplots_adjust(right=.1)

plt.show()

结合多个可视化

保存绘图

如果对绘图结果感到满意,并希望将其保存到磁盘。可以在Matplotlib中保存许多文件格式。要查看可用选项列表,请使用:

print(fig.canvas.get_supported_filetypes())

输出结果为:

{'ps': 'Postscript', 'eps': 'Encapsulated Postscript', 'pdf': 'Portable Document Format', 'pgf': 'PGF code for LaTeX', 'png': 'Portable Network Graphics', 'raw': 'Raw RGBA bitmap', 'rgba': 'Raw RGBA bitmap', 'svg': 'Scalable Vector Graphics', 'svgz': 'Scalable Vector Graphics', 'jpg': 'Joint Photographic Experts Group', 'jpeg': 'Joint Photographic Experts Group', 'tif': 'Tagged Image File Format', 'tiff': 'Tagged Image File Format'}

然后使用figure.Figure.savefig()来将数字保存到磁盘。请注意,将在下面显示几个有用的标志:

  • transparent = True如果格式支持,则使保存的图形的背景透明。
  • dpi = 80控制输出的分辨率(每平方英寸的点数)。
  • bbox_inches ="tight"符合图中绘图的界限。

上一篇: Matplotlib绘制图像 下一篇: 使用样式表和rcParams自定义Matplotlib