Matplotlib绘图生命周期

广告位

本教程旨在使用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() 

Matplotlib绘图生命周期

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

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

Matplotlib绘图生命周期

控制样式

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) 

Matplotlib绘图生命周期

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

自定义绘图

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

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

Matplotlib绘图生命周期

如果想一次设置多个项的属性,那么可使用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绘图生命周期

看起来这样会切断底部的一些标签。可以告诉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') 

Matplotlib绘图生命周期

接下来,为绘图添加标签。要使用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') 

Matplotlib绘图生命周期

还可以使用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') 

Matplotlib绘图生命周期

对于标签,可以使用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) 

Matplotlib绘图生命周期

结合多个可视化

可以在同一轴的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绘图生命周期

保存绘图

如果对绘图结果感到满意,并希望将其保存到磁盘。可以在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"符合图中绘图的界限。

  

拾荒的老头

关于作者: 拾荒的老头

为您推荐