Matplotlib和seaborn的使用

在这一章,我们介绍如何利用Python中的Matplotlib和seaborn这两个包,进行各种图表的绘制。

介绍

数据可视化,或者说绘图,是数据分析中最重要的工作之一。绘图可能是数据探索过程的一部分,例如帮助我们找出异常值、进行必要的数据转换、得出有关模型的想法等。绘图也可以用于结果分析和呈现,画出图表或者做一个可交互的数据可视化也许是数据分析工作的最终目标。在这一部分,我们学习如何在Python中使用Matplotlib和seaborn进行各种类型图像的绘制。

Matplotlib是一个用于创建出版质量图表的桌面绘图包,由John Hunter于2002年启动,其目的是为Python构建一个MATLAB式的绘图接口。Matplotlib和IPython社区进行合作,简化了从IPython shell(包括现在的Jupyter notebook)进行交互式绘图。Matplotlib支持各种操作系统上许多不同的GUI后端,而且还能将图片导出为各种常见的矢量(vector)和光栅(raster)图,例如PDF、SVG、JPG、PNG、BMP、GIF等。

随着时间的发展,Matplotlib衍生出了多个数据可视化的工具集,它们使用Matplotlib作为底层。Pandas自身就内置了很多画图的方法,用于简化从DataFrame和Series绘制图形。另一个库seaborn是由Michael Waskom创建的静态图形库,简化了许多图表的创建代码。

1. Matplotlib绘图

1.1 Matplotlib引入

Matplotlib的通常引入约定是:

import matplotlib
import matplotlib.pyplot as plt

为了让Matplotlib生成的图片在Jupyter Notebook中更好地显示,我们可以指定图片输出的格式为svg:

%config InlineBackend.figure_format = 'svg'

我们来看一个最简单的例子,如何画出一组数据的形状:

import numpy as np
data = np.arange(10)
plt.plot(data)

Matplotlib画出来的图像如下图所示:
图片说明

1.2 Figure和SubPlot

Matplotlib的图像都位于Figure对象中。我们可以用plt.figure创建一个新的Figure:

fig = plt.figure(figsize=[6,4])

不过我们不能通过空的Figure进行绘图,必须用add_subplot创建一个或多个subplot才行:

fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)
ax1.plot(np.random.randn(50).cumsum(), 'k--')
ax2.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)
ax3.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))

其中

  • ax1 = fig.add_subplot(2, 2, 1)的意思是:图像应该是2×2的(即最多4张图),且当前ax1选中的是4个subplot中的第一个(编号从1开始)。
  • ax1.plot(np.random.randn(50).cumsum(), 'k--')的意思是在ax1对应的subplot中画一个折线图,"k--"是一个线型选项,用于告诉Matplotlib绘制黑色虚线图。
  • ax2.hist(np.random.randn(100), bins=20, color='k', alpha=0.3)的意思是在ax2对应的subplot中画一个直方图,bins表示我们要把数据分成20组,然后统计每组的数据个数,color表示颜色,alpha设置透明度。
  • ax3.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))的意思是画一个散点图,第一个参数为x坐标的列表,第二个参数为y坐标的列表。

绘制出的图像如下图所示:
图片说明

这几种图表是最标准的图像类型,更多的参数设置可以在matplotlib的文档中找到更详细的说明:https://matplotlib.org/2.2.4/api/index.html

创建包含subplot网格的figure是一个非常常见的任务,matplotlib有一个更为方便的方法plt.subplots,它可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组:

fig, axes = plt.subplots(2, 2)
print(axes)

输出为:

[[<matplotlib.axes._subplots.AxesSubplot object at 0x0000022CB6683DD8>
  <matplotlib.axes._subplots.AxesSubplot object at 0x0000022CB66C7208>]
 [<matplotlib.axes._subplots.AxesSubplot object at 0x0000022CB66EE5F8>
  <matplotlib.axes._subplots.AxesSubplot object at 0x0000022CB6714AC8>]]

同时也会展示一个空的图:
图片说明

1.3 调整subplot周围的间距

默认情况下,matplotlib会在subplot外围留下一定的边距,并在subplot之间留下一定的间距。间距跟图像的高度和宽度有关。我们可以通过Figure的subplots_adjust函数修改间距:subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None),其中wspace和hspace用于控制宽度和高度的百分比,可以用作subplot之间的间距。举例如下,间距收缩到了0:

fig, axes = plt.subplots(2, 2, sharex=True, sharey=True)
for i in range(2):
    for j in range(2):
        axes[i, j].hist(np.random.randn(500), bins=50, color='k', alpha=0.5)
plt.subplots_adjust(wspace=0, hspace=0)  # 各subplot之间没有间距

输出的图像如下图所示:
图片说明

1.4 颜色、标记和线型

Matplotlib的plot函数接受一组X和Y坐标,还可以接受一个表示颜色和线型的字符串缩写。例如,要根据x和y绘制绿色虚线,我们可以执行如下代码:

x = [1, 2, 3, 4, 5]  # x坐标一般按照从小到大的顺序排列好
y = [3, 7, 2, 4, 6]
# plt.plot(x, y, 'g--')
plt.plot(x, y, linestyle='--', color='g')  # 分别指明linestyle和color这两个参数也可以实现一样的功能

画出的图像如下图所示:
图片说明

Matplotlib支持多种线型,可以参考文档:https://matplotlib.org/2.2.4/api/_as_gen/matplotlib.lines.Line2D.html#matplotlib.lines.Line2D.set_linestyle

我们可以给每个数据点加上标记marker,标记也可以放到格式字符串中,但标记类型和线型必须放在颜色后面:

x = [1, 2, 3, 4, 5]  # x坐标一般按照从小到大的顺序排列好
y = [3, 7, 2, 4, 6]
# plt.plot(x, y, 'r--o')
plt.plot(x, y, linestyle='--', color='r', marker='o')  # 指明marker='o'可以实现一样的功能

画出的图像如下图所示:
图片说明

Matplotlib中支持很多标记,可以参考文档:https://matplotlib.org/2.2.4/api/markers_api.html#module-matplotlib.markers

1.5 设置标题、轴标签、刻度以及刻度标签

要设置标题的时候,我们可以用set_title,要设置轴标签时,我们可以用set_xlabel和set_ylabel。要改变X轴刻度,最简单的办法是使用set_xticks和set_xticklabels。前者告诉Matplotlib要将刻度放在数据范围中的哪些位置,默认情况下,这些位置也就是刻度标签。但我们可以通过set_xticklabels将任何其他的值用作标签,并设置字体大小、旋转角度等参数。改变Y轴刻度的方法类似。

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())  # 绘制一段随机生成的数据的累积和
ax.set_xticks([0, 250, 500, 750, 1000])  # 设置x轴刻度的位置
# 设置刻度标签
# rotation选项设定x刻度标签倾斜30度
# fontsize设定x刻度标签的字体大小
ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'], rotation=30, fontsize='small')
ax.set_title('This is the title')  # 设置标题
ax.set_xlabel('This is x label')  # 设置x轴标签
ax.set_ylabel('This is y label')  # 设置y轴标签

画出的图像如下图所示:
图片说明

我们也可以批量设定绘图选项:

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())  # 绘制一段随机生成的数据的累积和
ax.set_xticks([0, 250, 500, 750, 1000])  # 设置x轴刻度的位置
# 设置刻度标签
# rotation选项设定x刻度标签倾斜30度,设置为负数会朝着另一个方向倾斜
# fontsize设定x刻度标签的字体大小
ax.set_xticklabels(['one', 'two', 'three', 'four', 'five'],
                    rotation=30, fontsize='small')

props = {
    'title': 'This is the title',
    'xlabel': 'This is x label',
    'ylabel': 'This is y label'
}
ax.set(**props)

1.6 添加图例

图例(legend)是一种用于标识图表元素的重要工具,特别是当我们在一张图里面画有多条曲线的时候。添加图例的方式有多种。最简单的是在添加subplot的时候传入label参数:

from numpy.random import randn
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
# 我们仍然产生一些随机数来进行绘图
ax.plot(randn(1000).cumsum(), 'k', label='one')
ax.plot(randn(1000).cumsum(), 'r--', label='two')
ax.plot(randn(1000).cumsum(), 'b.', label='three')
# 然后我们用ax.legend()或plt.legend()来自动创建图例
# 参数loc会指定图例在图片中的位置,例如左上角还是右下
# loc='best'会让程序自动判断合适的位置
ax.legend(loc='best')

画出的图像如下图所示:
图片说明

要从图例中去除一个或多个元素,不传入label或传入label='nolegend'即可。

1.7 注解以及在Subplot上绘图

除标准的绘图类型,我们可能还希望绘制一些子集的注解,可能是文本、箭头或其他图形等。注解和文字可以通过text、arrow和annotate函数进行添加。text可以将文本绘制在图表的指定坐标(x,y),还可以加上一些自定义格式:

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())
x = 100
y = 10
ax.text(x, y, 'Hello world!', family='monospace', fontsize=10)

画出的图像如下图所示:
图片说明

注解中可以既含有文本也含有箭头。接下来通过一个比较复杂的例子来感受一下效果,我们根据美国的标准普尔500指数价格(来自Yahoo!Finance)绘制一张曲线图,并标出2008年到2009年金融危机期间的一些重要日期。

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# 我们读取本地的一个csv数据集
import pandas as pd
data = pd.read_csv('./stock_px.csv', index_col=0, parse_dates=True)
# 使用spx这一列数据
spx = data['SPX']

# 直接调用pandas的series的plot函数
spx.plot(ax=ax, style='k-')

# 这些是我们要标注的内容
# 因为我们的x轴是时间点,因此这个列表就表示了某个时间点发生的事件
from datetime import datetime
crisis_data = [
    (datetime(2007, 10, 11), 'Peak of bull market'),
    (datetime(2008, 3, 12), 'Bear Stearns Fails'),
    (datetime(2008, 9, 15), 'Lehman Bankruptcy')
]

for date, label in crisis_data:
    # 第一个参数s=label代表我们要注释的内容
    # xy:箭头指向的位置
    # asof函数用来取对应date这个横坐标点的标普500值,如果刚好这个点对应的值是NaN
    # 那么就会给出这个值之前最近一个不是NaN的值,这样确保了我们的x和y坐标都是有效的数字
    # xytext:注释的文字所处的位置
    # arrowprops:箭头的风格和种类
    # horizontalalignment控制X方向上,文本位于左右还是居中显示
    # verticalalignment则是控制y方向上,文本位于上下还是居中显示
    ax.annotate(s=label, xy=(date, spx.asof(date) + 75),
                xytext=(date, spx.asof(date) + 225),
                arrowprops=dict(facecolor='black', headwidth=4, width=2,
                                headlength=4),
                horizontalalignment='left', verticalalignment='top')

# 限制一下显示图片的x轴和y轴的范围
ax.set_xlim(['1/1/2007', '1/1/2011'])
ax.set_ylim([600, 2000])

# 设置标题
ax.set_title('Important dates in the 2008-2009 financial crisis')

其中stock_px.csv可以在这里下载,提取码为khac。绘制出的图像如下图所示:
图片说明

1.8 图形的绘制

图形的绘制要麻烦一些。Matplotlib有一些表示常见图形的对象。这些对象被称为块(patch)。其中有些(如Rectangle和Circle),可以在matplotlib.pyplot中找到,但完整集合位于matplotlib.patches。要在图表中添加一个图形,我们需要创建一个块对象shp,然后通过ax.add_patch(shp)将其添加到subplot中:

fig = plt.figure(figsize=[6,6])
ax = fig.add_subplot(1, 1, 1)

# 第一个参数是矩形的左下角,第二个和第三个参数是矩形的长度和宽度
rect = plt.Rectangle((0.2, 0.75), 0.4, 0.15, color='k', alpha=0.3)
# 第一个参数是圆的圆心坐标,第二个参数是圆的半径
circ = plt.Circle((0.7, 0.2), 0.15, color='b', alpha=0.3)
# 第一个参数是多边形的顶点值
pgon = plt.Polygon([[0.15, 0.15], [0.35, 0.4], [0.2, 0.6]],
                   color='g', alpha=0.5)

ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(pgon)

画出来的图像如下图所示:
图片说明

1.9 将图表保存到文件

利用plt.savefig可以将当前图表保存到文件。例如,要将图表保存为SVG文件,我们只需输入:

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())
x = 100
y = 10
ax.text(x, y, 'Hello world!', family='monospace', fontsize=10)
plt.savefig('figpath.svg')

文件类型是通过文件扩展名推断出来的。因此,如果你使用的是.pdf,就会得到一个PDF文件。最常用的两个重要的选项是dpi(控制“每英寸点数”分辨率)和bbox_inches(可以剪除当前图表周围的空白部分)。例如要保存一张带有最小白边且分辨率为400DPI的PNG图片:

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())
x = 100
y = 10
ax.text(x, y, 'Hello world!', family='monospace', fontsize=10)
plt.savefig('figpath.png', dpi=400, bbox_inches='tight')

1.10 Matplotlib配置

Matplotlib自带一些配色方案,以及为生成出版质量的图片而设定的默认配置信息。几乎所有默认行为都能通过一组全局参数进行自定义,它们可以管理图像大小、subplot边距、配色方案、字体大小、网格类型等。一种Python编程方式配置系统的方法是使用rc方法。例如,要将全局的图像默认大小设置为6×4,你可以执行:

plt.rc('figure', figsize=(6, 4))
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())

这样输出的图像的大小就会发生相应的改变:
图片说明

rc的第一个参数是希望自定义的对象,如'figure'、'axes'、'xtick'、'ytick'、'grid'、'legend'等。其后可以跟上一系列的关键字参数。一个简单的办法是将这些选项写成一个字典:

font_options = {'family' : 'monospace',
                'weight' : 'bold',
                'size' : 7}
plt.rc('font', **font_options)
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.random.randn(1000).cumsum())

要了解全部的自定义选项,可以查阅matplotlib的配置文件matplotlibrc(位于matplotlib/mpl-data目录中)。如果对该文件进行了自定义,并将其放在你自己的.matplotlibrc目录中,则每次使用matplotlib时就会加载该文件。seaborn包有若干内置的绘图主题或类型,它们使用了matplotlib的内部配置。

2 使用pandas和seaborn绘图

Matplotlib实际上是一种比较低级的工具。要绘制一张图表,我们组装一些基本组件就行:数据展示(即图表类型:线型图、柱状图、盒形图、散布图、等值线图等)、图例、标题、刻度标签以及其他注解型信息。

在很多情况下,我们可以直接使用pandas和seaborn来简化绘制图形的代码。引入seaborn会修改matplotlib默认的颜色方案和绘图类型,以提高可读性和美观度。即使我们不打算使用seaborn中的具体函数,也可以引入seaborn提高美观度:

import pandas as pd
import seaborn as sns

2.1 线型图

Series和DataFrame都有一个用于生成各类图表的plot方法。默认情况下,它们所生成的是线型图:

s = pd.Series(np.random.randn(10).cumsum(), index=np.arange(0, 100, 10))
s.plot()

如下图所示:
图片说明

该Series对象的索引会被传给matplotlib,并用以绘制X轴。可以通过use_index=False禁用该功能。X轴的刻度和界限可以通过xticks和xlim选项进行调节,Y轴就用yticks和ylim。Pandas的大部分绘图方法都有一个可选的ax参数,它可以是一个matplotlib的subplot对象。这使你能够在网格布局中更为灵活地处理subplot的位置。plot参数的完整列表参见下表:

参数 说明
label 用于图例的标签
ax 要在其上进行绘制的matplotlib subplot对象。如果没有设置,默认使用当前的
style 将要传给matplotlib的风格字符串(如'ko--')
alpha 图表的填充不透明度(0到1之间)
kind 可以是'line', 'bar', 'barh', 'kde'
logy 在Y轴上使用对数标尺
use_index 将对象的索引用作刻度标签
rot 旋转刻度标签(0到360)
xticks 用作X轴刻度的值
yticks 用作Y轴刻度的值
xlim X轴的界限(例如[0, 10])
ylim Y轴的界限
grid 显示轴网格线(默认打开)

DataFrame的plot方法在一个subplot中为各列绘制一条线,并自动创建图例:

df = pd.DataFrame(np.random.randn(10, 4).cumsum(0),
                  columns=['A', 'B', 'C', 'D'],
                  index=np.arange(0, 100, 10))
df.plot()

如下图所示:
图片说明

DataFrame还有一些用于对列进行灵活处理的选项,例如,是要将所有列都绘制到一个subplot中还是创建各自的subplot。具体见下表:

参数 说明
subplots 将各个DataFrame列绘制到单独的subplot中
sharex 如果subplots=True,则共用同一个X轴,包括刻度和界限
sharey 如果subplots=True,则共用同一个Y轴
figsize 表示图像大小的元组
title 表示图像标题的字符串
legend 添加一个subplot图例(默认为True)
sort_columns 以字母表顺序绘制各列,默认使用当前列顺序

2.2 柱状图

plot.bar()plot.barh()分别绘制水平和垂直的柱状图。这时,Series和DataFrame的索引将会被用作X(bar)或Y(barh)刻度。color='k'和alpha=0.7设定了图形的颜色为黑色,并使用部分的填充透明度。

对于DataFrame,柱状图会将每一行的值分为一组,并排显示,DataFrame各列的名称"Genus"被用作了图例的标题,如下图所示:

df = pd.DataFrame(np.random.rand(6, 4),
                  index=['one', 'two', 'three', 'four', 'five', 'six'],
                  columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df.plot.bar()

如下图所示:
图片说明

设置stacked=True即可为DataFrame生成堆积柱状图,这样每行的值就会被堆积在一起:

df.plot.barh(stacked=True, alpha=0.5)

如下图所示:
图片说明

接下来以一个有关小费的数据集为例,比较pandas和seaborn的绘图功能。这个数据集可以在这里下载(提取码为4j48)。假设我们想要做一张堆积柱状图以展示每天各种聚会规模的数据点的百分比。然后整理出表示日期和聚会规模关系的交叉表:

tips = pd.read_csv('tips.csv')
party_counts = pd.crosstab(tips['day'], tips['size'])
# 由于1个人和6个人的情况比较少,去掉
party_counts = party_counts.loc[:, 2:5]
print(party_counts)

输出为:

size   2   3   4  5
day                
Fri   16   1   1  0
Sat   53  18  13  1
Sun   39  15  18  3
Thur  48   4   5  1

然后进行归一化,使得各行的和为1,并生成图表:

# 对每一行进行归一化
party_pcts = party_counts.div(party_counts.sum(1), axis=0)
print(party_pcts)
party_pcts.plot.bar()

输出为:

size         2         3         4         5
day                                         
Fri   0.888889  0.055556  0.055556  0.000000
Sat   0.623529  0.211765  0.152941  0.011765
Sun   0.520000  0.200000  0.240000  0.040000
Thur  0.827586  0.068966  0.086207  0.017241

绘制的图像如下图所示:
图片说明

对于在绘制一个图形之前,需要进行合计的数据,使用seaborn可以减少工作量。用seaborn来看每天的小费比例:

tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])
print(tips.head())

输出为:

   total_bill   tip     sex smoker  day    time  size   tip_pct
0       16.99  1.01  Female     No  Sun  Dinner     2  0.063204
1       10.34  1.66    Male     No  Sun  Dinner     3  0.191244
2       21.01  3.50    Male     No  Sun  Dinner     3  0.199886
3       23.68  3.31    Male     No  Sun  Dinner     2  0.162494
4       24.59  3.61  Female     No  Sun  Dinner     4  0.172069

绘制图像:

sns.barplot(x='tip_pct', y='day', data=tips, orient='h')

如下图所示:
图片说明

Seaborn的绘制函数使用data参数,它可能是pandas的DataFrame。其它的参数是关于列的名字。因为一天的每个值有多次观察,柱状图的值是tip_pct的平均值。绘制在柱状图上的黑线代表95%置信区间(可以通过可选参数配置)。seaborn.barplot有颜色选项,使我们能够通过一个额外的值设置:

# x轴为tip_pct,y轴为day,利用颜色再对time分类
sns.barplot(x='tip_pct', y='day', hue='time', data=tips, orient='h')

如下图所示:
图片说明

Seaborn已经自动修改了图形的美观度:默认调色板,图形背景和网格线的颜色。你可以用seaborn.set在不同的图形外观之间切换:

sns.set(style="whitegrid")

2.3 直方图和密度图

直方图(histogram)是一种可以对值频率进行离散化显示的柱状图。数据点被拆分到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量。再以前面那个小费数据为例,通过在Series使用plot.hist方法,我们可以生成一张“小费占消费总额百分比”的直方图:

tips['tip_pct'].plot.hist(bins=50)

如下图所示:
图片说明

与此相关的一种图表类型是密度图,它是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的。一般的过程是将该分布近似为一组核(即诸如正态分布之类的较为简单的分布)。因此,密度图也被称作KDE(Kernel Density Estimate,核密度估计)图。使用plot.kde和标准混合正态分布估计即可生成一张密度图:

tips['tip_pct'].plot.density()

如下图所示:
图片说明

Seaborn的distplot方法绘制直方图和密度图更加简单,还可以同时画出直方图和连续密度估计图。作为例子,考虑一个由两个不同的标准正态分布组成的双峰分布:

comp1 = np.random.normal(0, 1, size=200)
comp2 = np.random.normal(10, 2, size=200)
values = pd.Series(np.concatenate([comp1, comp2]))
sns.distplot(values, bins=100, color='k')

如下图所示:
图片说明

2.4 散布图或点图

点图或散布图是观察两个一维数据序列之间的关系的有效手段。我们读取一个macrodata数据集,选择了几个变量,然后计算对数差。这个数据集可以在这里下载(提取码为fs22)。

macro = pd.read_csv('macrodata.csv')
data = macro[['cpi', 'm1', 'tbilrate', 'unemp']]
trans_data = np.log(data).diff().dropna()
print(trans_data[-5:])

输出为:

          cpi        m1  tbilrate     unemp
198 -0.007904  0.045361 -0.396881  0.105361
199 -0.021979  0.066753 -2.277267  0.139762
200  0.002340  0.010286  0.606136  0.160343
201  0.008419  0.037461 -0.200671  0.127339
202  0.008894  0.012202 -0.405465  0.042560

然后可以使用seaborn的regplot方法,它可以做一个散布图,并加上一条线性回归的线:

sns.regplot('m1', 'unemp', data=trans_data)
plt.title('Changes in log %s versus log %s' % ('m1', 'unemp'))

如下图所示:
图片说明

在探索式数据分析工作中,同时观察一组变量的散布图是很有意义的,这也被称为散布图矩阵(scatter plot matrix)。纯手工创建这样的图表很费工夫,所以seaborn提供了一个便捷的pairplot函数,它支持在对角线上放置每个变量的直方图或密度估计:

sns.pairplot(trans_data, diag_kind='kde', plot_kws={'alpha': 0.2})

如下图所示:
图片说明

2.5 分面网格(facet grid)和类型数据

有多个分类变量的数据可视化的一种方法是使用分面网格。seaborn有一个有用的内置函数catplot,可以简化制作多种分面图,例如按照天/时间/吸烟者的小费百分比:

# x,y,hue:数据集变量名
# row,col:更多分类变量进行平铺显示的变量名
# data:数据集名
# kind:可选:point 默认, bar 柱形图, count 频次, box 箱体, violin 提琴, strip 散点,swarm 分散点
sns.catplot(x='day', y='tip_pct', hue='time', col='smoker',
            kind='bar', data=tips[tips.tip_pct < 1])

如下图所示:
图片说明

除了在分面中用不同的颜色按时间分组,我们还可以通过给每个时间值添加一行来扩展分面网格:

sns.catplot(x='day', y='tip_pct', row='time',
            col='smoker', kind='bar', data=tips[tips.tip_pct < 1])

如下图所示:
图片说明

catplot支持其它的绘图类型,我们可能会用到。例如,盒图(它可以显示中位数,四分位数和异常值)就是一个有用的可视化类型:

# 通过kind参数来指明
sns.catplot(x='tip_pct', y='day', kind='box', data=tips[tips.tip_pct < 0.5])

如下图所示:
图片说明

小结

在这一部分,我们介绍了Python中绘图的基本方法,主要是Matplotlib和seaborn这两个包的使用。在实际的使用过程中,大家要根据自己的数据调整图形的一些属性,例如字体的大小、横轴坐标的范围等等,使得绘制的图形尽可能美观和准确。

全部评论

相关推荐

点赞 评论 收藏
分享
投递长鑫存储等公司8个岗位
点赞 评论 收藏
分享
就前几天旅游的时候,打开抖音就经常刷到这类视频:以前是高学历学生、老师、主持人,现在做着团播、擦边主播的工作,以及那些经过精心包装的“职业转型”故事——从铺天盖地的VLOG到所谓的“04年夜场工作日记”,这些内容在初中升学、高考放榜等关键时间节点持续发酵。可以说非常直接且精准地在潜移默化地影响着心智尚未成熟的青少年,使其对特殊行业逐渐脱敏。那我就想问了:某些传播公司、平台运营者甚至某些夜场的老板,你们究竟在传递怎样的价值观?点开那些视频,评论区里也是呈现明显的两极分化:一种是​​经济下行论​​:“现在就业市场已经艰难到这种程度了吗?”​​一种是事实反驳派​​:这些创作者往往拥有名校背景,从事着...
牛客刘北:被环境教育的,为了能拿到足够的钱养活自己,不甘心也得甘心,现在的短视频传播的思想的确很扭曲,但是很明显,互联网玩上一年你就能全款提A6,但你全心全意不吃不喝工作一年未必能提A6,但是在高考中考出现这个的确很扭曲,在向大家传播“不上学,玩互联网也可以轻松年入百万”,不是人变了,是社会在变
预测一下26届秋招形势
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务