科研绘图教程 06 | 有代码!学会rcParams让你的底蕴更加深厚!

文摘   2024-11-16 20:33   新加坡  
点击订阅公众号 | 前沿学术成果每日更新               

目录:

  • 什么是 rcParams?

  • 如何设置 rcParams?

  • 可以设置哪些参数?

  • 为什么要使用 rcParams?

  • 实际示例

    • 基本绘图

    • 添加样式

    • 使用 rcParams 提取样式

    • 线图示例

    • 箱线图示例

  • 在项目中使用 matplotlibrc 文件

    • 重置rcParams

    • 以默认设置绘制箱线图作为参考

    • 下载并配置新的Matplotlib新文件

    • 重新加载箱线图以查看样式变化

使用 matplotlib 的 rcParams 设置样式,比较不同行业虚假收入数据的箱线图

Matplotlib 是一个强大且可扩展的绘图库,但可能显得复杂且冗长。

rcParams(运行时配置参数对象)提供了一种将样板代码提取到配置文件的方法,显著减少重复代码,并确保始终获得美观且布局良好的图表。它还使您的设置和样式可复用,便于在项目之间传输。

什么是 rcParams?

Matplotlib 默认有一系列参数,定义了绘图的外观和功能。rcParams 允许更改这些默认值,例如默认的颜色图。

tab10 颜色图的示例为带状水平颜色

定性色彩图“tab10”——由 Matplotlib 生成

如何设置 rcParams?

可以在运行时(代码中)设置 rcParams,但最有用的是在名为 matplotlibrc 的文本配置文件中设置。将此文件放在项目目录中,Matplotlib 加载时会自动查找并应用其中的设置。

可以设置哪些参数?

可以在示例 matplotlibrc 文件中找到所有可用的参数设置。该文件按部分组织,包括:

- BACKENDS
- LINES
- PATCHES
- HATCHES
- BOXPLOT
- FONT
- TEXT
- LaTeX
- AXES
- DATES
- TICKS
- GRIDS
- LEGEND
- FIGURE
- IMAGES
- CONTOUR PLOTS
- ERRORBAR PLOTS
- HISTOGRAM PLOTS
- SCATTER PLOTS
- AGG RENDERING
- PATHS
- SAVING FIGURES
- INTERACTIVE KEYMAPS
- ANIMATION

为什么要使用 rcParams?

  • 简化代码:减少重复和样板代码,使代码更简洁。
  • 一致性:确保项目中的所有图表具有统一的风格和布局。
  • 可重复性:设置和样式可在项目之间轻松传输。

实际示例

基本绘图

使用默认设置绘制一个散点图:

fig, ax = plt.subplots()
scatter = ax.scatter(earnings['age'], earnings['experience'], c=earnings['earnings'], s=100, alpha=0.6, norm='log')
ax.set_title('Earnings Based on Experience and Age')
ax.set_xlabel('Age [Years]')
ax.set_ylabel('Experience [Years]')

# 添加颜色图例
kw = {"fmt":"{x:2g}k""func":lambda s: s/1000}
colour_legend = ax.legend(*scatter.legend_elements(**kw), title="Earnings [USD]", reverse=True)
ax.add_artist(colour_legend)

plt.show()
默认样式的散点图

添加样式

在代码中直接添加样式(未使用 rcParams):

# 设置图形尺寸和 DPI,启用布局
fig, ax = plt.subplots(figsize=(85), dpi=100, constrained_layout=True)

# 设置散点图样式
scatter = ax.scatter(earnings['age'], earnings['experience'], c=earnings['earnings'], s=100, alpha=0.6, norm='log', cmap="YlOrRd", edgecolors='Gray', marker='p')

# 启用网格线
ax.grid(True, axis='both', which='major', linestyle='dotted')

# 设置标题和轴标签样式
ax.set_title('基于经验和年龄的收入', loc='right', fontsize=14, fontweight='bold', color='Gray')
ax.set_xlabel('年龄 [年]', fontweight='bold', color="Gray")
ax.set_ylabel('经验 [年]', fontweight='bold', color="Gray")

# 添加颜色图例
kw = {"fmt""{x:2g}k""func"lambda s: s / 1000}
colour_legend = ax.legend(*scatter.legend_elements(**kw), title="收入 [美元]", reverse=True, markerscale=1.5, facecolor='#EEEEEE', labelcolor='#555555', edgecolor='#757575', framealpha=0.5)
title = colour_legend.get_title()
title.set_color("Gray")
title.set_fontsize(11)
ax.add_artist(colour_legend)
plt.show()
应用样式的散点图

使用 rcParams 提取样式

将样式设置提取到 rcParams:

mpl.rcParams['figure.figsize'] = (85)
mpl.rcParams['figure.titleweight'] = 'bold'
mpl.rcParams['figure.dpi'] = 100
mpl.rcParams['figure.constrained_layout.use'] = True

mpl.rcParams['text.color'] = 'Gray'

mpl.rcParams['axes.grid'] = True
mpl.rcParams['axes.grid.axis'] = 'both'
mpl.rcParams['axes.grid.which'] = 'major'
mpl.rcParams['axes.labelweight'] = 'bold'
mpl.rcParams['axes.labelcolor'] = 'Gray'
mpl.rcParams['axes.titlesize'] = 14
mpl.rcParams['axes.titlelocation'] = 'right'
mpl.rcParams['axes.titleweight'] = 'bold'
mpl.rcParams['axes.titlecolor'] = 'Gray'

mpl.rcParams['grid.linestyle'] = 'dotted'

mpl.rcParams['image.cmap'] = 'YlOrRd'

mpl.rcParams['scatter.edgecolors'] = 'Gray'
mpl.rcParams['scatter.marker'] = 'p'

mpl.rcParams['legend.markerscale'] = 1.5
mpl.rcParams['legend.edgecolor'] = '#757575'
mpl.rcParams['legend.facecolor'] = '#EEEEEE'
mpl.rcParams['legend.framealpha'] = 0.5
mpl.rcParams['legend.labelcolor'] = '#555555'
mpl.rcParams['legend.title_fontsize'] = 11

现在,使用简化的代码即可生成相同的图表:

fig, ax = plt.subplots()
scatter = ax.scatter(earnings['age'], earnings['experience'], c=earnings['earnings'], s=100, alpha=0.6, norm='log')
ax.set_title('基于经验和年龄的收入')
ax.set_xlabel('年龄 [年]')
ax.set_ylabel('经验 [年]')

# 添加颜色图例
kw = { "fmt""{x:2g}k""func"lambda s: s/1000 } 
colour_legend = ax.legend(*scatter.legend_elements(**kw), title= "收入 [美元]" , reverse=True
ax.add_artist(colour_legend)
plt.show()
通过 rcParams 设置样式的散点图

线图示例

为线图设置 rcParams,例如更改颜色循环:

mpl.rcParams['axes.prop_cycle'] = cycler(color=['#1b9e77''#d95f02''#7570b3''#e7298a''#66a61e''#e6ab02''#a6761d''#666666'])

mpl.rcParams['lines.linewidth'] = 3.0
mpl.rcParams['lines.linestyle'] = 'dashdot'
mpl.rcParams['lines.dash_capstyle'] = 'projecting'

绘制线图:

x = np.linspace(010100)
y1 = np.sin(x)
y2 = np.cos(x)
y3 = np.tan(x)/27
y4 = np.arctan(x)

fig, ax = plt.subplots()
ax.plot(x, y1, label="sin(x)")
ax.plot(x, y2, label="cos(x)")
ax.plot(x, y3, label="tan(x)/27")
ax.plot(x, y4, label="arctan(x)")
ax.set_title('随机函数绘图')
ax.set_xlabel('时间 [s]')
ax.set_ylabel('振幅 [m]')
ax.legend()
plt.show()
应用 rcParams 设置的线图

箱线图示例

为箱线图设置 rcParams:

mpl.rcParams['boxplot.patchartist'] = True
mpl.rcParams['boxplot.showmeans'] = True

mpl.rcParams['boxplot.flierprops.marker'] = 'D'
mpl.rcParams['boxplot.flierprops.markerfacecolor'] = 'C1'
mpl.rcParams['boxplot.flierprops.markeredgecolor'] = 'w'
mpl.rcParams['boxplot.flierprops.markersize'] = '7'

mpl.rcParams['boxplot.boxprops.color'] = 'C0'

mpl.rcParams['boxplot.whiskerprops.color'] = 'C0'
mpl.rcParams['boxplot.whiskerprops.linewidth'] = 2.0
mpl.rcParams['boxplot.whiskerprops.linestyle'] = (0, (13))

mpl.rcParams['boxplot.capprops.color'] = 'C0'
mpl.rcParams['boxplot.capprops.linewidth'] = 2.0

mpl.rcParams['boxplot.medianprops.color'] = 'w'
mpl.rcParams['boxplot.medianprops.linewidth'] = 2.0
mpl.rcParams['boxplot.medianprops.linestyle'] = (0, (0.51.5))

mpl.rcParams['boxplot.meanprops.marker'] = 'D'
mpl.rcParams['boxplot.meanprops.markerfacecolor'] = 'C5'
mpl.rcParams['boxplot.meanprops.markeredgecolor'] = 'w'
mpl.rcParams['boxplot.meanprops.markersize'] = 7
mpl.rcParams['boxplot.meanprops.linestyle'] = 'none'

绘制箱线图:

fields = profits.field.unique() 
field_array = [earnings.loc[earnings['field'] == field, 'earnings'for field in fields]

fig, ax = plt.subplots()
boxplot = ax.boxplot(field_array, labels=fields)
ax.set_title('基于工作领域的收入分布')
ax.set_xlabel('工作领域')
ax.set_ylabel('收入 [美元]')
ax.yaxis.set_major_formatter(tkr.FuncFormatter(lambda x, pos: '{data:g}K'.format(data=x/1000)))
plt.show()
应用 rcParams 设置的箱线图

在项目中使用 matplotlibrc 文件

如果在绘图代码中反复写入之前的rcParams代码,也是一件很复杂的事。所以我建议使用matplotlibrc文件,即将配置项写入到一个文件中,在绘图脚本中引入该文件中即可:将 rcParams 设置保存到项目目录中的 matplotlibrc 文件中,Matplotlib 加载时会自动应用这些设置。这样可以在不同项目中复用相同的样式设置。

我已经创建了一个“matplotlibrc”文件,并使用本文迄今为止生成的所有设置对其进行了预配置。该文件可在文未获取:

有了这个文件,现在可以按照下面流程检查它是否按预期工作以及体验新绘图配置

您也可以根据自己的实验使用/编辑此文件

重置rcParams

目前的程序代码中,设置了许多 rcParams。需要清除它们,以便我们有一个干净的开始(即重置回 Matplotlib 默认值)。

mpl.rcParams.update(mpl.rcParamsDefault)

以默认设置绘制箱线图作为参考

这将确认所有内容都已恢复为 Matplotlib 默认值。

fig, ax = plt.subplots()
boxplot = ax.boxplot(field_array, labels=fields)
ax.set_title('Earnings Distribution based on Field of Work')
ax.set_xlabel('Field of Work')
ax.set_ylabel('Earnings [USD]')
ax.yaxis.set_major_formatter(tkr.FuncFormatter(lambda x, pos: '{data:g}K'.format(data=x/1000)))
plt.show()
使用默认 matplotlib 设置生成的箱线图

下载并配置新的Matplotlib新文件

matplotlibrc 文件下载到脚本的根目录


mpl.matplotlib_fname()
from importlib import reload 
reload(mpl)  #  重新加载 Matplotlib,以便它获取新文件

脚本根目录放置 matplotlibrc 文件,mpl.matplotlib_fname() 应该会返回你脚本根目录中的 matplotlibrc 文件路径,而不是matplotlib库中的配置文件。这意味着你可以通过修改脚本目录下的 matplotlibrc 文件来控制matplotlib的配置,而不影响全局的matplotlib配置。

重新加载箱线图以查看样式变化

加载我们配置的 matplotlibrc 文件后,绘图现在应该再次完全配置。

fig, ax = plt.subplots()
boxplot = ax.boxplot(field_array, labels=fields)
ax.set_title('Earnings Distribution based on Field of Work')
ax.set_xlabel('Field of Work')
ax.set_ylabel('Earnings [USD]')
ax.yaxis.set_major_formatter(tkr.FuncFormatter(lambda x, pos: '{data:g}K'.format(data=x/1000)))
plt.show()
使用 matplotlib 的 rcParams 设置样式,比较不同行业虚假收入数据的箱线图

参考:https://towardsdatascience.com/matplotlib-make-your-plotting-life-easier-with-rcparams-d88f202fa83c

🌟关于该实验的完整代码🌟

首先非常感谢朋友们对我的文章和公众号的支持!非常高兴能和大家分享一些文献和机器学习相关信息。如果你觉得这篇文章对你有帮助,并对完整的代码感兴趣,两步就可以得到这份代码啦:1)将我的公众号文章(任一)分享到朋友圈,并收集到10个赞;2)完成后,请将分享截图后台私信给我想要的代码并留下邮箱,后续将发送完整的实验代码给您作为感谢。

这样不仅可以帮助更多的人获得有价值的信息,也能鼓励我继续创作出更多优质内容。感谢你的支持与理解,期待你的截图哦!😊

               

               

声明:本公众号分享的前沿学术成果来源于各学术网站,不依法享有其所有权。若原作者发现本次分享中的文字及图片涉及侵权,请立刻联系公众号后台或发送邮件,我们将及时修改或删除!         

邮箱:environmodel@sina.com         

若您认为有用,欢迎

Environmodel设为星标,或

点击“在看”或“分享”给他人

Environmodel
Environmodel(环境模型)专注于环境科学与工程领域的建模及模型研究进展,并分享涵盖机器学习、深度学习以及人工智能等相关领域的理论知识、主流工具和Python编程技巧。
 最新文章