注:转载请注明出处
目录一、简述
二、matplotlib基础函数基本形式
figure和axes的关系
子图的绘制
导出矢量图三、Seaborn基础
四、绘图实例散点图
条形图
直方图
核密度图
箱线图
小提琴图
双变量关系图jointplot
回归图
pairplot 图
heatmap 图
一、简述
本文介绍基于pandas、matplotlib、seaborn库的Python数据可视化。pandas库是数据分析库,实现了一些基本的绘图方法。matplotlib和seaborn是Python中最常用的可视化工具,Python数据可视化一般是通过较底层的 Matplotlib 库和较高层的 Seaborn 库实现的。
Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn就能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。
那么Pandas与Seaborn之间有什么区别呢?其实两者都是使用了matplotlib来作图,但是有非常不同的设计差异。
在只需要简单地作图时直接用Pandas,但要想做出更加吸引人,更丰富的图就可以使用Seaborn;Pandas的作图函数并没有太多的参数来调整图形,所以你必须要深入了解matplotlib;Seaborn的作图函数中提供了大量的参数来调整图形,所以并不需要太深入了解matplotlib。
建议用以下几个步骤学习如何使用matplotlib:
1. 学习基本的matplotlib术语,尤其是什么是图和坐标轴
2. 始终使用面向对象的接口,从一开始就养成使用它的习惯
3. 用基础的pandas绘图开始你的可视化学习
4. 用seaborn进行更复杂的统计可视化
5. 用matplotlib来定制pandas或者seaborn可视化
matplotlib作图的基本组成如下图:
导入数据可视化需要的包
# 导入包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
# 为了在jupyter notebook内嵌网页中显示图形,可打开以下开关
# 如果没有打开开关,每次图形显示时要使用函数:plt.show()
%matplotlib inline
#解决中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
二、Matplotlib基础
1. 函数基本形式
Matplotlib画图函数一般为如下形式:
plt.图名(x, y, '颜色 marker 线型')
x = np.linspace(0, 2 * np.pi, 20)
plt.figure(figsize=(6, 4))# 新建一个图像,设置图像大小
plt.plot(x, np.sin(x), 'ro-', label='sinx')# 设置颜色、标记符号、线型、图例标签
plt.plot(x, np.cos(x), 'b*--', label='cosx')
plt.title('plot curve', fontsize=25)# 标题
plt.xlim(-1, 7)# x轴范围
plt.ylim(-1.5, 1.5)# y轴范围
plt.xlabel('x', fontsize=20)# x轴标签
plt.ylabel('y', fontsize=20)# y轴标签
plt.legend(loc='best')# 图例
plt.show()
2. figure和axes的关系
在matplotlib中,整个图像为一个Figure对象。在Figure对象中可以包含一个,或者多个Axes对象。每个Axes对象都是一个拥有自己坐标系统的绘图区域。每个Axes对象都是一个拥有自己坐标系统的绘图区域。
相应的,matplotlib有两种画图方式,pyplot方法和axes方法。pyplot代码简洁,适合在不涉及子图绘制的情况下使用;axes适合在绘制子图的情况下使用。
注:axes作图通过ax.set_{something}()设置图形参数
# pyplot作图
plt.figure()
plt.plot(np.arange(6), np.arange(6), color='r')
plt.scatter([0.5, 4.1, 4.8, 3], [6, 8, 3.1, 1.2], color='b', marker='^')
plt.title('pyplot')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
# axes作图一
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(np.arange(6), np.arange(6), color='r')
ax.scatter([0.5, 4.1, 4.8, 3], [6, 8, 3.1, 1.2], color='b', marker='^')
ax.set_title('axes1')
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()
# axes作图二
fig, ax = plt.subplots()
ax.plot(np.arange(6), np.arange(6), color='r')
ax.scatter([0.5, 4.1, 4.8, 3], [6, 8, 3.1, 1.2], color='b', marker='^')
ax.set_title('axes2')
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()
3. 子图的绘制
子图的绘制有两种方式,pyplot方式和axes面向对象的方式。
pyplot方式:subplot函数
subplot(nrows, ncols, index, **kwargs)
axes方式一:add_subplot函数
add_subplot(nrows, ncols, index, **kwargs)
axes方式二:subplots函数
fig, ax = plt.subplots(ncols=列数, nrows=行数[, figsize=图片大小, ...])
# pyplot方式
plt.figure()
X = np.arange(0.01, 10, 0.01)
# 分成2*2,占用第1个子图
plt.subplot(221)
plt.plot(X, np.sin(X), 'r-')
# 分成2*2,占用第2个子图
plt.subplot(222)
plt.plot(X, np.cos(X), 'g-')
# 分成2*1,占用第2个子图(即占用2*2第3、4子图)
plt.subplot(212)
plt.bar(np.arange(6), np.array([2, 4, 1, 6, 3, 8]))
plt.suptitle('pyplot')
plt.show()
# axes方式一:add_subplot
# 参数同plt.subplot一致
fig = plt.figure()
ax1 = fig.add_subplot(221)
ax1.plot(X, np.sin(X), 'r-')
ax2 = fig.add_subplot(222)
ax2.plot(X, np.cos(X), 'g-')
ax3 = fig.add_subplot(212)
ax3.bar(np.arange(6), np.array([2, 4, 1, 6, 3, 8]))
fig.suptitle('add_subplot')
plt.show()
# axes方式二:subplots
# 相比add_subplot,函数调用比较简洁,但是不能自定义子图布局
fig, ax = plt.subplots(ncols=2, nrows=2, figsize=(8, 6))
X = np.arange(0.01, 10, 0.01)
ax[0, 0].plot(X, 2 * X - 1)
ax[0, 0].set_title("Linear")
ax[0, 1].plot(X, np.log(X))
ax[0, 1].set_title("Log")
ax[1, 0].plot(X, np.exp(X))
ax[1, 0].set_title("Exp")
ax[1, 1].plot(X, np.sin(X))
ax[1, 1].set_title("Sin")
fig.suptitle('subplots')
plt.show()
4. 导出矢量图
plt.figure()
plt.plot(np.arange(6))
# pdf 格式
plt.savefig('./filename.pdf',format='pdf')
# svg 格式
plt.savefig('./filename.svg',format='svg')
三、Seaborn基础
Seaborn 要求原始数据的输入类型为 pandas 的 DataFrame 或 Numpy 数组,画图函数一般为如下形式
sns.图名(x='X轴 列名', y='Y轴 列名', data=原始数据df对象)
sns.图名(x='X轴 列名', y='Y轴 列名', hue='分组绘图参数', data=原始数据df对象)
sns.图名(x=np.array, y=np.array[, ...])
Seaborn有五个预设好的主题(style):darkgrid, whitegrid, dark, white,和ticks(四周加边框和刻度)。它们各自适用于不同的应用和个人喜好。缺省的主题是darkgrid。
有4种预设好的上下文(context),按相对大小排序分别是:paper, notebook, talk,和poster.缺省的规模是notebook
颜色(palette)有:muted(常用),RdBu,Blues_d,Set1等
通过sns.set()设置主题、上下文、调色板等,例:
sns.set(style='white', context='talk', palette="muted", color_codes=True)
四、绘图实例
# 加载数据
iris = sns.load_dataset('iris')
titanic = sns.load_dataset('titanic')
tips = sns.load_dataset('tips')
iris.head()
titanic.head()
tips.head()
1. 散点图
pandas作图
iris.plot(x='sepal_length', y='sepal_width', kind='scatter')
matplotlib作图
使用plt.scatter()方法来做散点图,第一个参数作为x轴,第二参数作为y轴,注意两个参数都只能是列表数据或者Series
plt.scatter(iris['sepal_length'], iris['sepal_width'])
seaborn作图
seaborn中有两个散点图,一个是普通的散点图,另一个是可以看出分布密度的散点图
# 普通的散点图
sns.stripplot(y="sepal_width", data=iris)
# 带分布密度的散点图
sns.swarmplot(y="sepal_width", data=iris)
2. 条形图
pandas作图
# kind='barh'水平条形图
titanic.pclass.value_counts().plot(kind='bar')
matplotlib作图
plt.bar(np.arange(8), np.array([1, 4, 2, 3, 3, 5, 6, 3]))
seaborn作图
# barplot的统计函数,默认是变量的均值 estimator=np.mean
sns.barplot(x='day', y='total_bill', data=tips)
# 绘制变量中位数的条形图,estimator指定统计函数
sns.barplot(x='day', y='total_bill', hue='sex', data=tips, estimator=np.median)
# 统计图countplot,对因子变量计数,然后绘制条形图
sns.countplot(x='pclass', data=titanic)
3. 直方图
要制作直方图,首先把X轴的值的范围等分成多个间隔,然后数出每个间隔中包含的值的数量,然后把该数量作为Y轴的值。
pandas作图
iris.hist('sepal_width', by='species',layout=(1,3), bins=8)
iris.plot(y='sepal_width', kind='hist')
matplotlib作图
plt.hist(iris['sepal_width'])# 若设置参数density=True,则计算概率密度值
(array([ 4., 7., 22., 24., 37., 31., 10., 11., 2., 2.]),
array([2. , 2.24, 2.48, 2.72, 2.96, 3.2 , 3.44, 3.68, 3.92, 4.16, 4.4 ]),
)
seaborn作图
# 默认既绘制核密度曲线,也绘制直方图
# 直方图hist=True,核密度曲线kde=True
sns.distplot(iris['sepal_width'])
4. 核密度图
pandas作图
iris.plot(y='sepal_width', kind='kde')
seaborn作图
# 单变量
sns.kdeplot(iris['sepal_width'])
# 双变量密度图,相当于等高线图了
# shade 参数改用颜色深浅表示密度的大小
sns.kdeplot(iris['sepal_width'], iris['sepal_length'], shade=True)
5. 箱线图
箱型图是一种用作显示一组数据分散情况资料的统计图,基于五数概括法(最小值,第一个四分位数,第二个四分位数(中位数),第三个四分位数,最大值)的数据的一个图形汇总,还需要用到四分位数间距IQR = 第三个四分位数 - 第一个四分位数。
pandas作图
iris.boxplot(column='sepal_width', by='species')
iris.plot(y='sepal_width', kind='box')
matplotlib作图
plt.boxplot(iris['sepal_width'])
seaborn作图
# 单变量箱线图
sns.boxplot(y='total_bill', data=tips)
# 分组箱线图,两层分组,第一层分组因子是day,在x轴不同位置绘制,第二层分组因子是sex,不同的因子用不同颜色区分
# 相当于分组之后又分组
sns.boxplot(x='day', y='total_bill', hue='sex', data=tips)
6. 小提琴图
小提琴图其实是箱线图与核密度图的结合,箱线图展示了分位数的位置,小提琴图则展示了任意位置的密度,通过小提琴图可以知道哪些位置的密度较高。在图中,白点是中位数,黑色盒型的范围是下四分位点到上四分位点,细黑线表示须。外部形状即为核密度估计(在概率论中用来估计未知的密度函数,属于非参数检验方法之一)。
matplotlib作图
plt.violinplot(tips['total_bill'])
seaborn作图
sns.violinplot(y='total_bill', data=tips)
# 分组
sns.violinplot(x='day', y='total_bill', data=tips)
sns.despine()# 不显示网格边框线
# 二次分组,各取一半组成一个小提琴图
sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True,
inner="quart")
sns.despine(left=True)
7. 双变量关系图jointplot
# kind参数可以使用不同的图形反应两变量的关系,比如点图,线图,核密度图
# 默认绘制双变量的散点图,计算两个变量的直方图,计算两个变量的相关系数和置信度
# kind : { “scatter” | “reg” | “resid” | “kde” | “hex” }
sns.jointplot(x='total_bill', y='tip', data=tips)
# 核密度
sns.jointplot(x='total_bill', y='tip', data=tips, kind='kde')
8. 回归图
# 默认scatter=True, fit_reg=True
sns.lmplot(x="total_bill", y="tip", data=tips)
# 分组的线性回归图,通过hue参数控制
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips)
# col, row控制分组子图
sns.lmplot(x="total_bill", y="tip", row="sex", col="time", data=tips, size=3)
9. pairplot 图
两两组合多个特征做出多个对比图
sns.pairplot(iris, vars=['sepal_length', 'sepal_width', 'petal_length'], hue="species")
10. heatmap 图
heatmap 图一般用来描述 feature 的相关性矩阵
sns.heatmap(iris.corr(), square=True, annot=True)
# 美化
colormap = plt.cm.viridis
plt.figure(figsize=(6,6))
sns.heatmap(iris.corr(),linewidths=0.1, square=True, cmap=colormap, linecolor='white', annot=True)
参考资料