所用数据集资源:
《利用python进行数据分析》数据集
折线图
Series和DataFrame都有一个plot属性,用于绘制基本图形,默认情况下绘制的是折线图:
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
s = pd.Series(np.random.randn(10).cumsum(),index=np.arange(0,100,10))
s.plot()
plt.show()
默认会将对象的索引作为x轴,可以通过传入use_index=False来禁用这个功能。x的刻度和范围可以使用xticks和xlim选项进行调整,y轴类似。
对于DataFrame的plot方法,可以在同一个子图中将每一列绘制为不同的折线,并自动生成图例:
df = pd.DataFrame(np.random.randn(10,4).cumsum(0),columns=list('ABCD'),index=np.arange(0,100,10))
df.plot()
plt.show()
Series.plot方法参数如下:
参数 | 描述 |
---|---|
label | 图例标签 |
ax | 绘图所用的matplotlib子图图像;如果没传值,则使用当前活动的子图 |
style | 传给matplotlib的样式字符串,比如’ko–’ |
alpha | 图片的不透明度(0-1) |
kind | 可以是‘area’、‘bar’、‘barh’、‘density’、‘hist’、‘kde’、‘line’、‘pie’ |
logy | 在y轴上使用对数缩放 |
use_index | 使用对象索引刻度标签 |
rot | 旋转标签(0-360) |
xticks,yticks | 用于x和y轴刻度的值 |
xlim,ylim | x轴和y轴的范围(如[0,10]) |
grid | 展示轴网络(默认是打开的) |
DataFrame除了拥有Series的plot方法的选项外,还拥有以下选项:
参数 | 描述 |
---|---|
subplots | 将DataFrame的每一列绘制在独立的子图中 |
sharex,sharey | 如果为True,则共享相同的x轴或者y轴 |
figsize | 生成图片的尺寸(元组) |
title | 标题字符串 |
legend | 添加子图图例(默认为True) |
sort_colunms | 按字母顺序绘制各列,默认情况下使用已有的列顺序 |
柱状图
使用plot.bar()和plot.barh()可以分别绘制垂直和水平的柱状图,索引会分别被作为x或y轴的刻度,看一下这个例子:
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()
在DataFrame中,柱状图将每一行中的值分组到并排的柱子中的一组:
fig,axes = plt.subplots(2,1)
df = pd.DataFrame(np.random.rand(6,4),
index=['one','two','three','four','five','six'],
columns=pd.Index(list('ABCD'),name='Genus'),
)
df.plot.bar()
plt.show()
可以传递stacked=True来生成堆积状图,效果如下:
下面是一个例子,使用书中给的csv文件,显示出每天各种规模的派对派对占比:
import pandas as pd
from matplotlib import pyplot as plt
tips = pd.read_csv('..\pydata-book-2nd-edition/examples/tips.csv')
party_counts = pd.crosstab(tips['day'],tips['size'])
# 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
party_counts = party_counts.loc[:,2:5]
# 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
party_pcts = party_counts.div(party_counts.sum(1),axis = 0)
# 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
party_pcts.plot.bar()
以下代码是使用sns.barplot来按星期计算小费百分比的例子:
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
tips = pd.read_csv('..\pydata-book-2nd-edition/examples/tips.csv')
tips['tip_pct'] = tips['tip']/(tips['total_bill']-tips['tip'])
# 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
sns.barplot(x='day',y='tip_pct',data=tips)
#柱子的值是tip_pct的平均值,黑线代表的是95%的置信区间
plt.show()
seaborn.plot有一个hue选项,允许我们通过一个额外的分类值将数据分类:
sns.barplot(x='day',y='tip_pct',data=tips,hue='time')
直方图和密度图
直方图是一种条形图,用于给出频率的离散显示。数据点被分成离散的,均匀间隔的箱,并且绘制每个箱中数据点的数量。使用Series中的plot.hist方法制作小费占总费用百分比的直方图:
tips['tip_pct'].plot.hist(bins=50)
使用plot.density则可以绘制密度图:
tips['tip_pct'].plot.density()
另外使用seaborn的displot方法则可以同时绘制出直方图和密度图。
散点图或点图
为了演示散点图和点图的使用,我们载入了作者给的macrodata数据集.选择了一些变量并且计算对数差,之后使用seaborn的regplot方法可以绘制散点图并拟合出一个线性回归直线:
import pandas as pd
from matplotlib import pyplot as plt
import seaborn as sns
import numpy as np
macro = pd.read_csv('..\pydata-book-2nd-edition/examples/macrodata.csv')
data = macro[['cpi','m1','tbilrate','unemp']]
trans_data = np.log(data).diff().dropna()
#diff方法表示计算第n行与第n-1行的差,并将结果放在第n行
print(trans_data)
sns.regplot('m1','unemp',data=trans_data)
plt.show()
使用seaborn中的pairplot函数,它支持在对角线上放置每个变量的直方图或者密度估计值:
sns.pairplot(trans_data,diag_kind='kde',plot_kws={'alpha':0.2})
分面网络和分类数据
分面网络是利用多种变量对数据进行可视化的方式。seaborn拥有一个有效的内建函数factorplot(现在已被重命名为catplot),可以简化多重分面绘图,现在让我们使用之前的tips数据集:
tips = pd.read_csv('..\pydata-book-2nd-edition/examples/tips.csv')
tips['tip_pct'] = tips['tip']/(tips['total_bill']-tips['tip'])
sns.catplot(x='day',y='tip_pct',hue='time',col='smoker',kind='bar',data=tips[tips.tip_pct<1])
plt.show()
可以使用row参数来进一步扩展分面网络:
sns.catplot(x='day',y='tip_pct',hue='time',col='smoker',kind='bar',row='time',data=tips[tips.tip_pct<1],legend_out=False)
catplot支持其他类型的图片,如箱型图等:
sns.catplot(x='day',y='tip_pct',data=tips[tips.tip_pct<0.5],kind='box')
图中五条水平黑色线依次是上边缘、上四分位数、中位数、下四分位数和下边缘。黑点是偏离的异常值。