目录:
什么是 rcParams?
如何设置 rcParams?
可以设置哪些参数?
为什么要使用 rcParams?
实际示例
基本绘图
添加样式
使用 rcParams 提取样式
线图示例
箱线图示例
在项目中使用 matplotlibrc 文件
重置rcParams
以默认设置绘制箱线图作为参考
下载并配置新的Matplotlib新文件
重新加载箱线图以查看样式变化
Matplotlib 是一个强大且可扩展的绘图库,但可能显得复杂且冗长。
rcParams(运行时配置参数对象)提供了一种将样板代码提取到配置文件的方法,显著减少重复代码,并确保始终获得美观且布局良好的图表。它还使您的设置和样式可复用,便于在项目之间传输。
什么是 rcParams?
Matplotlib 默认有一系列参数,定义了绘图的外观和功能。rcParams 允许更改这些默认值,例如默认的颜色图。
定性色彩图“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=(8, 5), 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'] = (8, 5)
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,例如更改颜色循环:
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(0, 10, 100)
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:
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, (1, 3))
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.5, 1.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()
在项目中使用 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新文件
将 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()
参考:https://towardsdatascience.com/matplotlib-make-your-plotting-life-easier-with-rcparams-d88f202fa83c
🌟关于该实验的完整代码🌟
首先非常感谢朋友们对我的文章和公众号的支持!非常高兴能和大家分享一些文献和机器学习相关信息。如果你觉得这篇文章对你有帮助,并对完整的代码感兴趣,两步就可以得到这份代码啦:1)将我的公众号文章(任一)分享到朋友圈,并收集到10个赞;2)完成后,请将分享截图后台私信给我想要的代码并留下邮箱,后续将发送完整的实验代码给您作为感谢。
这样不仅可以帮助更多的人获得有价值的信息,也能鼓励我继续创作出更多优质内容。感谢你的支持与理解,期待你的截图哦!😊
声明:本公众号分享的前沿学术成果来源于各学术网站,不依法享有其所有权。若原作者发现本次分享中的文字及图片涉及侵权,请立刻联系公众号后台或发送邮件,我们将及时修改或删除!
邮箱:environmodel@sina.com
若您认为有用,欢迎
将Environmodel设为星标,或
点击“在看”或“分享”给他人