虽然matplotlib的subplot函数可以方便的绘制子图,但是无法对子图大小进行自定义,而axes()函数可以通过设置轴域的范围来自定义子图的大小。
下面为一个示例:
1. 导入所需包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
2. 生成随机数据
3个df分别作为3个子图的数据,y的范围都在(0,10)
df1 = pd.DataFrame({'x':np.zeros(10),
'y':np.random.random(10)*10})
x2 = np.random.randint(0,10,15)
y2 = x2+np.random.random(15)
df2 = pd.DataFrame({'x':x2,
'y':y2})
x = np.random.random(30)
x3 = x*50+50
y3 = (x*6-3)**2+0.5
df3 = pd.DataFrame({'x':x3,
'y':y3})
3. 绘图
ylim = (0,10) # y轴刻度范围
ax = plt.axes([0,0,0.1,1], ylim=ylim) # 四个元素的列表表示[left, bottom, width, height]
plt.plot(df1['x'], df1['y'], '.', color='khaki', markersize=13)
plt.xticks([0], ['One\npoint']) # 设置x刻度及其label, tips: \n换行
ax = plt.axes([0.13,0,0.5,1], ylim=ylim)
plt.plot(df2['x'], df2['y'], '.', color='orangered', markersize=13)
plt.yticks([]) # 不显示y轴刻度
ax = plt.axes([0.66,0,0.6,1], ylim=ylim)
plt.plot(df3['x'], df3['y'], '.', color='mediumseagreen', markersize=13)
plt.yticks([]) # 不显示y轴刻度
# 添加自定义图注
import matplotlib.patches as mpatches
pal = {'df1':'khaki', 'df2':'orangered', 'df3':'mediumseagreen'}
p = [plt.plot([],[], marker='o', ms=10, color=pal[i],ls='', label=i)[0] for i in pal.keys()]
plt.legend(handles=p, fontsize=13, frameon=False, ncol=3,
loc='lower center',bbox_to_anchor=(-0.1,1)) # bbox_to_anchor是df3图中的相对位置
plt.show()
自定义子图
通过对轴域的设置可以很灵活的设置子图的大小和位置。
4. 添加拟合线
添加拟合线有两种方式,第一种通过numpy拟合手动添加拟合线,第二种通过seaborn直接绘制带拟合线的图。
第一种:
ylim = (0,10)
ax = plt.axes([0,0,0.1,1], ylim=ylim)
plt.plot(df1['x'], df1['y'], '.', color='khaki', markersize=13)
plt.xticks([0], ['One\npoint'])
ax = plt.axes([0.13,0,0.5,1], ylim=ylim)
plt.plot(df2['x'], df2['y'], '.', color='orangered', markersize=13)
plt.yticks([])
# 添加拟合线
para = np.polyfit(df2['x'],df2['y'],1) # 线性拟合
f = np.poly1d(para) # 生成函数
lx = [df2['x'].min(),df2['x'].max()]
plt.plot(lx, f(lx), 'm-', linewidth=1, alpha=0.8) # 绘制拟合线
ax = plt.axes([0.66,0,0.6,1], ylim=ylim)
plt.plot(df3['x'], df3['y'], '.', color='mediumseagreen', markersize=13)
plt.yticks([])
# 添加拟合线
para = np.polyfit(df3['x'],df3['y'],2) # 二次函数拟合
f = np.poly1d(para) # 生成函数
lx = np.linspace(df3['x'].min(), df3['x'].max(), 50)
plt.plot(lx, f(lx), 'm-', linewidth=1, alpha=0.8) # 绘制拟合的二次曲线
import matplotlib.patches as mpatches
pal = {'df1':'khaki', 'df2':'orangered', 'df3':'mediumseagreen'}
p = [plt.plot([],[], marker='o', ms=10, color=pal[i],ls='', label=i)[0] for i in pal.keys()]
plt.legend(handles=p, fontsize=13, frameon=False, ncol=3,
loc='lower center',bbox_to_anchor=(-0.1,1))
plt.show()
拟合线
第二种:
ylim = (0,10)
ax = plt.axes([0,0,0.1,1], ylim=ylim)
sns.regplot(x='x', y='y', data=df1, order=0, color='khaki') # 使用seaborn直接绘制
plt.xticks([0], ['One\npoint'])
plt.xlabel('')
plt.ylabel('')
ax = plt.axes([0.13,0,0.5,1], ylim=ylim)
sns.regplot(x='x', y='y', data=df2, order=1, color='orangered')
plt.yticks([])
plt.xlabel('')
plt.ylabel('')
ax = plt.axes([0.66,0,0.6,1], ylim=ylim)
sns.regplot(x='x', y='y', data=df3, order=2, color='mediumseagreen')
plt.yticks([])
plt.xlabel('')
plt.ylabel('')
import matplotlib.patches as mpatches
pal = {'df1':'khaki', 'df2':'orangered', 'df3':'mediumseagreen'}
p = [plt.plot([],[], marker='o', ms=10, color=pal[i],ls='', label=i)[0] for i in pal.keys()]
plt.legend(handles=p, fontsize=13, frameon=False, ncol=3,
loc='lower center',bbox_to_anchor=(-0.1,1))
plt.show()
拟合线2
seaborn绘制拟合曲线更加方便和美观,并且能能同时展示置信区间。
网友评论