import matplotlib.pyplot as plt
import numpy as np
# %matplotlib notebook
# from IPython import display
# %matplotlib inline
1 通过figure创建画布
# 简单实例
data = np.random.randn(100).cumsum() # 标准正态分布100样本值,在累计求合
plt.plot(data)
plt.show()
# 创建空白画布,返回figure实例
plt.figure(num=1, figsize=(10,10),dpi=200,facecolor='gray',edgecolor='r')
<Figure size 2000x2000 with 0 Axes>
<Figure size 2000x2000 with 0 Axes>
- num=None, 图编号
- figsize=None, 图大小
- dpi=None, 图分辨率
- facecolor=None, 背景颜色
- edgecolor=None, 边框颜色
plt.plot(data) # 没有什么变化,没明白怎么回事
plt.show()
2 通过subplot创建单个子图
data = np.random.randn(10).cumsum()
plt.subplot(221) # 把画布分成4份,在第一份上画图221等同于2,2,1
plt.plot(data)
plt.subplot(222)
plt.plot(data)
plt.subplot(212) # 把画布分成2份,在第二份上画图
plt.plot(data)
[<matplotlib.lines.Line2D at 0x119fcbe80>]
3 通过subplots创建多个子图
# 在notebook上这里有坑,所有代码要写在一个cell里面才能显示图片出来,不能拆开
fig,axes = plt.subplots(1,2)
data = np.random.randn(20).cumsum()
axes[0].plot(data,'g--')
axes[1].plot(data**2,'ko--')
plt.show()
4 通过add_subplot添加和选中子图
fig = plt.figure()
fig.add_subplot(1,2,1)
fig.add_subplot(1,2,2)
plt.plot(data)
plt.show()
5 添加各类标签
除图例要最后放之外,其他无先后顺序
- title() 标题
- xlabel() x 轴名称
- ylabel() y 轴名称
- xticks() x 轴刻度数目及取值
- xlim() x轴取值范围
- legend() 图例
plt.plot(data)
plt.title('demo')
plt.xlabel('x轴')
plt.xticks([0,10,20])
plt.legend('x=y')
plt.show()
# 上图中x轴有中文没有正常显示
from matplotlib.pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Arial Unicode MS']
plt.plot(data)
plt.title('demo')
plt.xlabel('x轴')
plt.xticks([0,10,20])
plt.legend('x=y')
plt.show()
6 常见图表
- plt.bar 条形图
- plt.barh 水平条形图
- plt.hist 直方图
- plt.pie 饼图
- plt.scatter 散点图
- plt.plot 折线图
- plt.boxplot 箱像图
- plt.stackplot 堆积图
# 直方图
# 直方图(Histogram)是一种可视化在连续间隔,或者是特定时间段内数据分布情况的图表,经常被用在统计学领域。
# 简单来说,直方图描述的是一组数据的频次分布,例如把年龄分成“0-5,5-10,……,80-85”17个组,统计一下中国人口年龄的分布情况。
# 直方图有助于我们知道数据的分布情况,诸如众数、中位数的大致位置、数据是否存在缺口或者异常值
data = np.random.randint(0,100,100)
plt.hist(data,
bins=8, # 条柱的个数
color='g',
alpha=0.5) # 透明度
(array([11., 6., 19., 12., 13., 17., 13., 9.]),
array([ 0. , 12.25, 24.5 , 36.75, 49. , 61.25, 73.5 , 85.75, 98. ]),
<a list of 8 Patch objects>)
# 柱状图
x = np.arange(5)
y1, y2 = np.random.randint(1,31,size=(2,5))
width = 0.25
ax = plt.subplot(1,1,1)
ax.bar(x,y1,width,color='b')
ax.bar(x+width,y2,width,color='r')
ax.set_xticks(x+width)
ax.set_xticklabels(['a','b','c','d','e'])
plt.show()
- 直方图展示数据的分布,柱状图比较数据的大小
- 直方图x轴为定量数据,柱状图x轴为分类数据
color
- b 蓝 g绿 r红 c青 y黄 k黑 w白
marker
- o 实心圆圈 D菱 h六边形 .点 s正方形
linestyle
- -实线 --长虚线 -.短点相间线 :短虚线
7 本地保存图形
# savefig()
data = np.random.randn(100)
plt.plot(data)
plt.savefig('zxt.png') # 要先保存在show(),否则是一张空图
plt.show()
8 seaborn 绘制统计图形
# diplot 单变量分布绘制函数
# jointplot 双变量分布绘制函数
import seaborn as sns
import numpy as np
import pandas as pd
sns.set() # 显示调用,获取默认绘图
np.random.seed(0) # 确定随机种子,保证每次执行生成的数字时一样的
arr = np.random.randn(100) # 标准正态分布的100个样本值
ax = sns.distplot(arr,bins=10) # 默认绘制核密度函数,方便查看数据分布情况,参数kde=True控制
df_obj = pd.DataFrame({"x": np.random.randn(100),
"y": np.random.randn(100)})
sns.jointplot(x="x",y="y",kind='scatter',data=df_obj) # 参数ratio来设置中心图与侧边图的大小比,默认为5
<seaborn.axisgrid.JointGrid at 0x1a1b0f5c18>
# 二维直方图
sns.jointplot(x="x",y="y",kind='hex',data=df_obj)
<seaborn.axisgrid.JointGrid at 0x1a1aefe400>
# 核密度图
sns.jointplot(x="x",y='y',data=df_obj,kind='kde')
<seaborn.axisgrid.JointGrid at 0x1a1bfcb390>
# sns.pairplot 绘制数据集与变量之间的关系
data = sns.load_dataset("tips")
sns.pairplot(data)
<seaborn.axisgrid.PairGrid at 0x1a1c24ef98>
# 用分类数据来绘图
# sns.swarmplot() sns.stripplot() 分类散点图
# sns.boxenplot() sns.violinplot 分布图
# sns.barplot sns.pointplot 统计估计图
sns.stripplot(x='day',y='total_bill',data=data) # 参数jitter 来控制数据展示
<matplotlib.axes._subplots.AxesSubplot at 0x1a1d2a1630>
sns.swarmplot(x='day',y='total_bill',data=data) # 数据不会重叠
<matplotlib.axes._subplots.AxesSubplot at 0x1a1cfa1470>
sns.boxenplot(x='day',y='total_bill',data=data)
<matplotlib.axes._subplots.AxesSubplot at 0x1a1cf6d278>
sns.violinplot(x='day',y='total_bill',data=data)
<matplotlib.axes._subplots.AxesSubplot at 0x1a1b1a7b00>