seaborn傻瓜级主题设置,轻松使图表达到报告和论文的样式要求。

本文介绍了如何使用Seaborn库创建符合报告或学位论文要求的图表,通过封装设置实现快速绘图。作者提供了几种预设的context样式、axes风格和色盘,并展示了如何自定义设置,包括线条宽度、网格线、字号等。同时,还定义了调整图片大小和设置坐标轴标题的函数,确保与Word文档匹配。文章通过实例展示了如何应用这些设定,绘制了多个图表,并给出了将设置应用于matplotlib的方法。
摘要由CSDN通过智能技术生成

作者:居居

日期: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的效果。
在这里插入图片描述

有什么特殊需要,大家根据自己的情况改进即可。

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值