首页Python19.使用Pandas和S...

19.使用Pandas和Seaborn绘图

matplotlib是一个底层工具,随着时间推移,matplotlib已经产生了一些数据可视化的附加工具包,Seaborn就是其中之一,Seaborn简化了很多常用可视化图表的生成。
导入Seaborn会修改默认的matplotlib配色方案和绘图样式,会提升图表的可读性和美观性。

1.折线图:

Series和DataFrame都有一个plot属性,用于绘制基本的图形,默认情况下绘制的是折线图。
x轴的刻度和范围可以通过xticksxlim选项进行设置,y轴可以通过yticksylim选项进行设置。

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

# 在编辑器中需要使用plt.show(s.plot())显示图形
s.plot()
Out[6]: <matplotlib.axes._subplots.AxesSubplot at 0x1ece3637668>

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()
Out[11]: <matplotlib.axes._subplots.AxesSubplot at 0x1ece3b0c278>
  • Series.plot()方法的参数列表:
参数说明
label图例标签
ax绘图时使用的子图对象,如果没有传值则使用当前的子图
style传递给matplotlib的样式字符串
alpha设置图片透明度(0-1)
kind图表类型,例如bar、pie等
logy在y轴上使用对数缩放
use_index使用对象索引刻度标签
rot刻度标签的旋转(0-360)
xticks设置x轴刻度的值
yticks设置y轴刻度的值
xlim设置x轴的范围
ylim设置y轴的范围
grid展示轴网格,默认为显示
  • DataFrame.plot()方法的参数列表:
参数说明
subplots将每一列绘制在独立的子图中
sharex如果subplots=True,则共享相同的x轴、刻度和范围
sharey如果subplots=True,则共享相同的y轴、刻度和范围
figsize设置生成的图片尺寸,传入值为一个元祖
title标题字符串
legend添加子图图例,默认为True
sort_columns按字母顺序绘制各列,默认情况下使用已有的列顺序

2.柱状图:

plt.bar()plt.barh()方法可以分别绘制垂直和水平的柱状图,索引会被用作x轴刻度或y轴刻度。

df = pd.DataFrame(np.random.rand(4,4),index=['one','two','three','four'],columns=pd.Index(['A','B','C','D'],name='sign'))

df.plot.bar()
Out[19]: <matplotlib.axes._subplots.AxesSubplot at 0x1ece3d1fe48>
df.plot.barh(stacked=True,alpha=0.6)
Out[20]: <matplotlib.axes._subplots.AxesSubplot at 0x1ece3dafac8>

3.直方图:

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

np.random.seed(0) # 设置随机种子
mu, sigma = 100, 20     # 均值和标准差
df = pd.DataFrame(np.random.normal(mu, sigma, size=100)) # 生成一个均值和方差给定的成正态分布的数组a
# 绘制直方图,参数bin(此处设置为40)表示直方图的个数,参数normed为0是表示每一个直方中出现的a的元素的个数归一化为出现的概率,因此此处y轴值为小数值,如果数normed为1表示每一个直方中出现的a的元素的个数
df.plot.hist(df, 40, normed=1, histtype='stepfilled', facecolor='red', alpha=0.75)
# 添加文本标签
plt.title('Histogram')
plt.show()

4.散点图:

使用seaborn中的regplot方法绘制散点图,并会拟合出一条线性回归线。

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

macro = pd.read_csv('./examples/macrodata.csv')
data = macro[['cpi','m1','tbilrate','unemp']]
trans_data = np.log(data).diff().dropna()
# print(trans_data[-5:])
plt.show(sns.regplot('m1','unemp',data=trans_data))

另外seaborn中的pairplot方法支持在对角线上放置每个变量的直方图或者密度图。
其中plot_kws参能够将配置选项传递给非对角线元素上的各个绘图使用。

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

macro = pd.read_csv('./examples/macrodata.csv')
data = macro[['cpi','m1','tbilrate','unemp']]
trans_data = np.log(data).diff().dropna()
# print(trans_data[-5:])
plt.show(sns.pairplot(trans_data,diag_kind='kde',plot_kws={'alpha':0.2}))

5.分面网格和分类数据:

分面网格是利用多种分组变量对数据进行可视化的操作。seaborn中的内建函数factorplot()可以简化多种分面绘图。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

# 按星期日期、时间、是否吸烟划分小费百分比
tips = pd.read_csv('./examples/tips.csv')
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])
plt.show(sns.factorplot(x='day',y='tip_pct',hue='time',col='smoker',kind='bar',data=tips[tips.tip_pct<1]))

还可以通过时间值添加一行来扩展分面网格。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

tips = pd.read_csv('./examples/tips.csv')
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])
plt.show(sns.factorplot(x='day',y='tip_pct',row='time',col='smoker',kind='bar',data=tips[tips.tip_pct<1]))

通过设置kind参数显示其他图类型。

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

tips = pd.read_csv('./examples/tips.csv')
tips['tip_pct'] = tips['tip'] / (tips['total_bill'] - tips['tip'])
plt.show(sns.factorplot(x='day',y='tip_pct',row='time',col='smoker',kind='box',data=tips[tips.tip_pct<1]))

Reference:
《Python for Data Analysis:Data Wrangling with Pandas,Numpy,and IPython》

RELATED ARTICLES

欢迎留下您的宝贵建议

Please enter your comment!
Please enter your name here

- Advertisment -

Most Popular

Recent Comments