python可视化数据分析R代码Python_数据分析_pandas

seaborn + matplotlib 画图(四): 自定义子

2021-09-10  本文已影响0人  WuYankang

虽然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绘制拟合曲线更加方便和美观,并且能能同时展示置信区间。

上一篇下一篇

猜你喜欢

热点阅读