《利用python进行数据分析》读书笔记之使用pandas和seaborn绘图


所用数据集资源:
《利用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()

dataframe中的绘图
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,ylimx轴和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()

DataFrame的柱状图
可以传递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')

箱型图
图中五条水平黑色线依次是上边缘、上四分位数、中位数、下四分位数和下边缘。黑点是偏离的异常值。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值