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

1、关于面向对象的 API 与 Pyplot 的说明

      Matplotlib 有两个接口。 第一个是面向对象 (OO) 接口。 在这种情况下,我们利用axis.Axes 的一个实例来在figure.Figure 的实例上呈现可视化。

      第二种基于 MATLAB 并使用基于状态的接口。 这被封装在 pyplot 模块中。 请参阅 pyplot 教程以更深入地了解 pyplot 界面。

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

      1)Figure 是可能包含 1 个或多个 Axes 的最终图像。

      2)Axes 代表一个单独的图(不要将它与“轴”这个词混淆,它指的是一个图的 x/y 轴)。

      我们调用直接从 Axes 进行绘图的方法,这为我们自定义绘图提供了更大的灵活性和功能。

2、我们要使用的数据

      我们将使用源自本教程的帖子中的数据。 它包含许多公司的销售信息。

import numpy as np

import matplotlib.pyplot as plt



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)


3、开始

      这些数据自然地可视化为条形图,每组一个条形图。 为了用面向对象的方法做到这一点,我们首先生成一个 figure.Figure 和 axes.Axes 的实例。 图形就像画布,而轴是画布的一部分,我们将在其上进行特定的可视化。

fig, ax = plt.subplots​()

#yyds干货盘点#数据可视化:plot的生命周期_自定义


      现在我们有了一个 Axes 实例,我们可以在它上面绘图。

fig, ax = plt.subplots​()

​ax.barh​(group_names​, group_data)

#yyds干货盘点#数据可视化:plot的生命周期_5e_02


#yyds干货盘点#数据可视化:plot的生命周期_自定义_03


4、控制风格

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

print(plt.style.available)

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

      您可以通过以下方式激活样式:

plt.style.use(‘fivethirtyeight')

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

5、自定义绘图

      现在我们已经有了一个我们想要的整体外观的图,所以让我们微调它以准备好打印。 首先让我们旋转 x 轴上的标签,以便它们显示得更清晰。 我们可以使用 axes.Axes.get_xticklabels() 方法访问这些标签:

fig, ax = plt.subplots​()

​ax.barh​(group_names​, group_data)

labels = ax.get_xticklabels​()

#yyds干货盘点#数据可视化:plot的生命周期_数据_04

      如果我们想一次设置多个项目的属性,使用 pyplot.setp() 函数会很有用。 这将采用 Matplotlib 对象的列表(或多个列表),并尝试为每个对象设置一些样式元素。

labels = ax.get_xticklabels​()

plt.setp​​(​labels​, rotation=45, horizontalalignment='right')

#yyds干货盘点#数据可视化:plot的生命周期_面向对象_05

      看起来像这样剪掉了底部的一些标签。 我们可以告诉 Matplotlib 自动为我们创建的图形中的元素腾出空间。 为此,我们设置了 rcParams 的自动布局值。 有关使用 rcParams 控制绘图的样式、布局和其他功能的更多信息,请参阅使用样式表和 rcParams 自定义 Matplotlib。

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

#yyds干货盘点#数据可视化:plot的生命周期_自定义_06

      接下来,我们为绘图添加标签。 要使用 OO 接口执行此操作,我们可以使用 Artist.set() 方法来设置此 Axes 对象的属性。

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

#yyds干货盘点#数据可视化:plot的生命周期_自定义_07

      我们还可以使用 pyplot.subplots() 函数调整此图的大小。 我们可以使用 figsize 关键字参数来做到这一点。

fig​, ax =plt.subplots​(figsize=(8, 4))

#yyds干货盘点#数据可视化:plot的生命周期_自定义_08



      对于标签,我们可以以函数的形式指定自定义格式指南。 下面我们定义一个函数,它接受一个整数作为输入,并返回一个字符串作为输出。 当与 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 = '${:1.1f}M'.format(x*1e-6)

else:

s = '${:1.0f}K'.format(x*1e-3)

return s

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


​ax.xaxis.set_major_formatter​(currency)

#yyds干货盘点#数据可视化:plot的生命周期_自动布局_09



6、组合多个可视化

      可以在axis.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

forgroupin [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​()

#yyds干货盘点#数据可视化:plot的生命周期_数据_10