matplotlib绘图与可视化2

文章目录

  • 前言
  • 一、使用pandas和seaborn绘图
    • 1.1 折线图
    • 1.2 柱状图
    • 1.3 直方图和密度图
    • 1.4 散点图或点图
    • 1.5 分面网格和分类数据
  • 总结


前言

matplotlib是一个相当底层的工具。你可以从其基本组件中组装一个图表:数据显示(即绘图类型:线、条、框、散点图、轮廓等)、图例、标题、刻度标记和其他注释。上一节我们是使用NumPy创建的数据进行绘图,这一节我们将讲述使用pandas和seaborn进行绘图


一、使用pandas和seaborn绘图

在pandas中,我们可能有多个数据列,并且带有行和列的标签。pandas自身有很多内建方法可以简化从DataFrame和Series对象生成可视化的过程。另一个库是seaborn,它是由Michael Waskom创建的统计图形库。seaborn简化了很多常用可视化类型的生成。

导入seaborn会修改默认的matplotlib配色方案和绘图样式,这会提高图表的可读性和美观性。

1.1 折线图

Series和DataFrame都有一个plot属性,用于绘制基本的图形。默认情况下,plot()绘制的是折线图:

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

matplotlib绘图与可视化2_第1张图片
Series对象的索引传入matplotlib作为绘图的x轴,你可以通过传入use_index=Flase来禁用这个功能。x轴的刻度和范围可以通过xticks和xlim选项进行调整,相应地y轴使用yticks和ylim进行调整。下表是plot全部选项的列表。

参数 描述
label 图例标签
ax 绘图所用的matplotlib子图对象;如果没有传值,则使用当前活动的matplotlib
style 传给matplotlib的样式字符串,比如’ko–’
alpha 图片不透明度(从0到1)
kind 可以是‘area’、’bar’、‘barh’、‘density’、‘hist’、’kde‘、’line‘、’pie‘
logy 在y轴上使用对数缩放
use_index 使用对象索引刻度标签
rot 刻度标签的旋转(0到360)
xticks 用于x轴刻度的值
yticks 用于y轴刻度的值
xlim x轴范围
ylim y轴范围
grid 展示轴网格(默认是打开的)

大部分pandas的绘图方法,接收可选的ax参数,该参数可以是一个matplotlib子图对象。这使你可以更为灵活地在网络布局中放置子图。

DataFrame的plot方法在同一个子图中将每一列绘制为不同的折线,并且自动生成图例:

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

matplotlib绘图与可视化2_第2张图片

DataFarme拥有多个选项,允许灵活地处理列。关于更多选项可以了解下表:

参数 描述
subplots 将DataFrame的每一列绘制在独立的子图中
sharex 如果subplots=True,则共享相同的x轴、刻度和范围
sharey 如果subplots=True,则共享相同的y轴
figsize 用于生成图片尺寸的元组
title 标题字符串
legend 添加子图图例(默认是True)
sort_columns 按字母顺序绘制各列,默认情况下使用已有的列顺序

1.2 柱状图

使用plot.bar()plot.barh() 可以分别绘制垂直和水平的柱状图。在绘制柱状图时,Series或DataFrame的索引将会被用作x轴刻度(bar)或y轴(barh):

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

fig,axes = plt.subplots(2,1)
data = pd.Series(np.random.rand(16),index=list('abcdefghijklmnop'))
data.plot.bar(ax=axes[0],color='k',alpha=0.7)
data.plot.barh(ax=axes[1],color='k',alpha=0.7)

plt.show()

matplotlib绘图与可视化2_第3张图片

选项color='k’和alpha=0.7将柱子的颜色设置为黑色,并将图像的填充色设置为部分透明。

在DataFrame中,柱状图将每一行中的值分组到并排的柱子中的一组:

fig,axes = plt.subplots(2,1)
data = pd.DataFrame(np.random.rand(6,4),
                    index=['one','two','three','four','five','six'],
                    columns=pd.Index(['A','B','C','D'],name='Genus'))
print(data)
data.plot.bar()
plt.show()
-----------------------------------------------------------------------------
Genus         A         B         C         D
one    0.918836  0.416516  0.747510  0.980806
two    0.115344  0.024363  0.281936  0.571838
three  0.880445  0.302825  0.833191  0.916196
four   0.300247  0.262174  0.652105  0.692285
five   0.007101  0.367594  0.193122  0.244853
six    0.216293  0.402296  0.787105  0.459348

matplotlib绘图与可视化2_第4张图片

请注意DataFrame的列名称’Genus’被用作了图例标题。我们可以通过传递stacked=True来生成堆积柱状图,会使得每一行的值堆积在一起:

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

matplotlib绘图与可视化2_第5张图片

对于下列数据集:
matplotlib绘图与可视化2_第6张图片
假设我们想要绘制一个堆积柱状图,用于展示每个派对在每天的数据点占比。使用read_csv载入数据,并根据星期日期和派对规模形成交叉表:

tips = pd.read_csv('D:\浏览器下载\pydata-book-2nd-edition\pydata-book-2nd-edition\examples/tips.csv')
party_counts = pd.crosstab(tips['day'],tips['size'])
print(party_counts)

#没有太多的1人和6人派对
party_counts = party_counts.loc[:,2:5]

#标准化至和为1
party_pcts = party_counts.div(party_counts.sum(1),axis=0)
print(party_pcts)
party_pcts.plot.bar()
plt.show()
-----------------------------------------------------------------------------------
size  1   2   3   4  5  6
day                      
Fri   1  16   1   1  0  0
Sat   2  53  18  13  1  0
Sun   0  39  15  18  3  1
Thur  1  48   4   5  1  3

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

matplotlib绘图与可视化2_第7张图片

你可以看到本数据集中的派对数量在周末会增加。

对于在绘图前需要聚合或汇总的数据,使用seaborn包会使工作更为简单。现在让我们看下使用seaborn进行按星期日期计算小费百分比:

tips = pd.read_csv('D:\浏览器下载\pydata-book-2nd-edition\pydata-book-2nd-edition\examples/tips.csv')
tips['tip_pct'] = tips['tip']/(tips['total_bill']-tips['tip'])
print(tips.head())
sns.barplot(x='tip_pct',y='day',data=tips,orient='h')
plt.show()
------------------------------------------------------------------------------
   total_bill   tip smoker  day    time  size   tip_pct
0       16.99  1.01     No  Sun  Dinner     2  0.063204
1       10.34  1.66     No  Sun  Dinner     3  0.191244
2       21.01  3.50     No  Sun  Dinner     3  0.199886
3       23.68  3.31     No  Sun  Dinner     2  0.162494
4       24.59  3.61     No  Sun  Dinner     4  0.172069

matplotlib绘图与可视化2_第8张图片
seaborn中的绘图函数使用一个data参数,这个参数可以是pandas的DataFrame。其他的参数则与列名有关。因为day列中有多个观测值,柱子的值是tip_pct的平均值。柱子上画出的黑线代表的是95%置信区间(置信区间可以通过可选参数进行设置)。

seaborn.barplot拥有一个hue选项,允许我们通过一个额外的分类值将数据分离:

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

matplotlib绘图与可视化2_第9张图片
注意seaborn自动改变了图表的美观性:默认的调色板、图背景和网格线条颜色。你可以使用seaborn.set在不同发绘图外观中进行切换:

sns.set(style='whitegrid')

1.3 直方图和密度图

直方图是一种条形图,用于给出值频率的离散显示。数据点被分成离散的,均匀间隔的箱,并且绘制每个箱中数据点的数量。使用之前的小费数据,我们可以使用Series的plot.hist 方法制作小费占总费用百分比的直方图:

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

matplotlib绘图与可视化2_第10张图片
密度图是一种与直方图相关的图表类型,它通过计算可能产生观察数据的连续概率分布估计而分布。通常的做法是将这种分布近似"内核"的混合,也就是像正态分布那样简单的分布。因此,密度图也被称为内核密度估计图(KDE)。plot.kde使用传统法定混合法估计绘制密度图:

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

matplotlib绘图与可视化2_第11张图片
distplot方法可以绘制直方图和连续密度估计,通过distplot方法seaborn是直方图和密度图的绘制更为简单。作为例子,考虑由两个不同的标准正态分布组成的双峰分布:

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')
plt.show()

matplotlib绘图与可视化2_第12张图片


1.4 散点图或点图

点图或散点图可以用于检验两个一维数据序列之间的关系。例如,这里我们从仓库例子中的macrodata数据集,并选择了一些变量,之后计算对数差:

macro = pd.read_csv('D:\浏览器下载\pydata-book-2nd-edition\pydata-book-2nd-edition\examples/macrodata.csv')
data = macro[['cpi','m1','tbilrate','unemp']]
trans_data = np.log(data).diff().dropna()
a = trans_data[-5:]
print(a)
sns.regplot(x='m1',y='unemp',data=trans_data)
plt.title('Changes in log %s versus log %s'%('m1','unemp'))
plt.show()
------------------------------------------------------------------------------------------
          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方法,该方法可以绘制散点图,并拟合出一条线性回归线:
matplotlib绘图与可视化2_第13张图片

在探索性数据分析中,能够查看一组变量中的所有散点图是有帮助的,这被称为成对图或散点图矩阵。从头开始绘制这样一个图是有点工作量的,所以seaborn有一个方便的pairplot函数,它支持在对角线上放置每个变量的直方图或密度估计图:

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

matplotlib绘图与可视化2_第14张图片
你可能会注意到ploy_ksw参数,这个参数使我们能够将配置选项传递给非对角元素上的各个绘图调用。


1.5 分面网格和分类数据

如果数据集有额外的分组维度,我们可以使用分面网格是利用多种分组变量对数据进行可视化的方式。seaborn拥有一个有效的内建函数factorplot(注意seaborn的版本,在seaborn0.12中没有这个方法),它可以简化多种分面绘图:

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

其中hue为分类参数,col为分表参数,kind为图表选择。
matplotlib绘图与可视化2_第15张图片

除了根据’time’在一面内将不同的柱分组为不同的颜色,我们还可以通过每个时间值添加一行来扩展网络:

row和col参数的功能相同

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

matplotlib绘图与可视化2_第16张图片
factorplot支持其他可能有用的图类型,具体取决于你要显示的内容。例如,箱形图(显示中位值、四分位数和异常值):

sns.factorplot(y='day',x='tip_pct',kind='box',data=tips[tips.tip_pct<0.5])

matplotlib绘图与可视化2_第17张图片


总结

以上就是今天要讲的内容,本文仅仅简单介绍了如何绘制折线图、柱状图、直方图和密度图、散点图或点图、分面网格和分类数据。目的是让你使用pandas、matplotlib和seaborn入门一些基础的数据可视化知识,如果直观地传达数据分析结果在你的工作中非常重要。

你可能感兴趣的:(python,matplotlib)