matplotlib是一个底层工具,随着时间推移,matplotlib已经产生了一些数据可视化的附加工具包,Seaborn就是其中之一,Seaborn简化了很多常用可视化图表的生成。
导入Seaborn会修改默认的matplotlib配色方案和绘图样式,会提升图表的可读性和美观性。
1.折线图:
Series和DataFrame都有一个plot属性,用于绘制基本的图形,默认情况下绘制的是折线图。
x轴的刻度和范围可以通过xticks
和xlim
选项进行设置,y轴可以通过yticks
和ylim
选项进行设置。
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》