作者:居居
日期:2021-11-08
Seaborn的傻瓜级别主题封装
如何轻松做出可以达到报告或者学位论文要求的seaborn图。
封装的目的是为了从繁重的绘图代码中解脱出来,专心搞科研!
不多解释了,看的懂的都懂!看不懂的请移步seaborn的Tutorial
一共有5种预设的context样式,分别是默认的“notebook”, 和 “paper”, “talk”, 以及 “poster”。
axes_style的预设有:“dark”,“white”,“darkgrid”,“whitegrid”,“ticks” 一共五种。
palette预设的色盘里面选择“tab10”,"Set1"等等
完整的语句示例:
sns.set_theme(context=yf_sns_context,style="darkgrid",font="Microsoft YaHei",palette=sns.color_palette("tab10"))
sns.ploting_context()可以查看每个context主题的基本设置。
sns.axes_style()可以查看axes样式。
set_theme()中的参数rc,用来自定义设置。
现在来预设主题,定义函数(一次定义,反复使用)
import seaborn as sns
#字体和坐标轴的线,等的刻度大小,唯一的参数是字号大小,根据自己的需要增加参数,下面这些都是TJxb的线宽标准(也可能有错)
def yf_sns_context(fontsize):
conText={
'axes.linewidth': 0.75, #坐标轴线宽为0.75
'grid.linewidth': 0.75, #网格线宽为0.75
'lines.linewidth': 1.0, #绘图线宽1.0
'lines.markersize': 3.0, #散点的大小3.0
'patch.linewidth': 1.0, #路径线宽1.0
'xtick.major.width': 0.75, #下面这是主副刻度线的宽度
'ytick.major.width': 0.75,
'xtick.minor.width': 0.75,
'ytick.minor.width': 0.75,
'xtick.major.size': 2,
'ytick.major.size': 2,
'xtick.minor.size': 1.2,
'ytick.minor.size': 1.2,
'font.size': 7.5,#字号
'axes.labelsize': fontsize,#xy坐标轴的字号
'axes.titlesize': fontsize,
'xtick.labelsize': fontsize,
'ytick.labelsize': fontsize,
'legend.fontsize': fontsize,
'legend.title_fontsize': fontsize
}
return conText
#这个函数是用来设置图片的大小,和word的印刷尺寸匹配,厘米和inch之间的换算关系是2.54,此外重新设置了坐标轴标题。
def posterProcess(g,w,h,xlab,ylab):
inch_cm=2.54
realFigHeight=w/inch_cm
realFigWidth=h/inch_cm
g.figure.set_size_inches(realFigHeight,realFigWidth)#修改
g.set_axis_labels(xlabel=xlab,ylabel=ylab)
#要在darkgrid上面设置刻度ticks
#这里是设置axes背景颜色跟ticks可见。
yf_sns_axes_style={
'xtick.bottom': True,
'ytick.left': True,
'axes.facecolor': '#EAEAF2',
}
#常用的单位可以放在这里,要不然每次都要手写就很烦!
myUnits={
#距离
"米":'/(m)',
"厘米":'/(cm)',
"米秒速":'/(m·$\mathregular{s^{-1}}$)',
"公里时速":'/(km·$\mathregular{h^{-1}}$)',
}
下面来画图
#第一步:设置主题
sns.set_theme(context=yf_sns_context(7.5),style="darkgrid",font="Microsoft YaHei",palette=sns.color_palette("tab10"),rc=yf_sns_axes_style)
# 第二步:载入数据
penguins = sns.load_dataset("penguins")
# 第三步:绘图
g = sns.jointplot(data=penguins, x="bill_length_mm", y="bill_depth_mm", hue="species", kind="kde",)
# 第四部:设置坐标轴标题和单位
xlab="距离"+myUnits["米秒速"]
ylab="速度"+myUnits["公里时速"]
# 第五步:调整图的横纵尺寸,几厘米就填几,下面这个例子就是10cm和7cm,xlab和ylab就是第四步的标题。
posterProcess(g,10,7,xlab,ylab)
# 第六步:看情况设置图例
sns.move_legend(
g.figure.axes[0], "lower center",
bbox_to_anchor=(0.85, 0), ncol=1, title=None, frameon=False,
)
g.figure
g.savefig("test.png", dpi=300)
#注意,jointplot比较特别,一个对象g中有三个axes,要调整图例只有选择第0个元素。单图就没有这个顾虑了。
下面再来画一张图(上面主题一次设置,以后反复使用)
tips = sns.load_dataset("tips")
g=sns.relplot(x="total_bill", y="tip", hue="smoker", data=tips,palette=sns.color_palette("Set1",10)[2:4])
xlab="距离"+myUnits["米秒速"]
ylab="速度"+myUnits["公里时速"]
posterProcess(g,7,6,xlab,ylab)
#下面这个是移动图例的位置
sns.move_legend(
g,"lower center",
bbox_to_anchor=(0.5, 1), ncol=2, title=None, frameon=False,
)
g.figure.savefig("test2.jpg",dpi=300,bbox_inches = 'tight')
seaborn还可以直接用来设置matplotlib的主题,plt会自动sns.set_theme()的内容
import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
x = np.arange(-2*np.pi, 2*np.pi, 0.01)
y1 = np.sin(x)
y2 = np.cos(x)
plt.figure(figsize=(10/2.54, 7/2.54),dpi=100)
plt.plot(x, y1, label='$sinx$',color=sns.color_palette("Set1",10)[2])
plt.plot(x, y2, label='$cosx$',color=sns.color_palette("Set1",10)[3])
plt.legend(loc='upper right')
plt.xlim(-2*np.pi-1, 2*np.pi+3)
plt.xticks([-2*np.pi, -np.pi, 0, np.pi, 2*np.pi], ['$-2\pi$', '$-\pi$', '$0$', '$\pi$', '$2\pi$'],fontsize=7.5)
plt.title('三角-函数',fontsize=7.5)
plt.xlabel('横坐标')
plt.ylabel('纵坐标')
plt.axhline(y=0, c='black')
plt.savefig('test3.jpg',dpi=300)
plt.show()
在做图的时候由于设置了长宽,于是在word中插入图片之后,只要图片的长宽(cm)跟绘图时候填的参数一样,那么字号就跟word中相应的字号相匹配,比如先前在程序中设置的7.5那么就对应word中的英文字符7.5,也就是六号字。中英文字号对应表自行百度。下面是插入word的效果。
有什么特殊需要,大家根据自己的情况改进即可。