news 2026/7/2 3:13:51

用 Python 画三类论文级图表:分组柱状图、双轴折线图与多面板图(解决中文乱码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用 Python 画三类论文级图表:分组柱状图、双轴折线图与多面板图(解决中文乱码)

一、中文显示与期刊风格配置(核心)

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'Times New Roman'] plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 300 plt.rcParams['savefig.dpi'] = 300 plt.rcParams['axes.linewidth'] = 1.2 plt.rcParams['grid.linewidth'] = 0.8 plt.rcParams['font.size'] = 10 plt.rcParams['axes.labelsize'] = 12

这一步主要解决三个问题:

  • 中文正常显示(避免乱码)
  • 负号正常显示
  • 图像达到论文分辨率(300 dpi)

二、数据结构设计

df = pd.DataFrame(data) years = ['2007年', '2015年', '2024年'] indicators = ['Agdp', 'urban', 'country', 'urb']

采用“长表结构”,方便按“年份 + 指标”筛选数据:

df[(df['年份']==y) & (df['指标']==ind)]

这种结构特别适合多指标对比绘图。


三、图1:分组柱状图(变异系数对比)

核心代码

for i, ind in enumerate(indicators): cv_vals = [...] ax.bar(...) wcv_vals = [...] ax.bar(..., hatch='///')

图表特点

  • 实心柱:变异系数(CV)
  • 斜线填充:加权变异系数
  • 同一指标使用同一颜色

优点

  • 一张图同时表达两个指标
  • 黑白打印也能区分(斜线填充)
  • 符合期刊常见风格

四、图2:双轴折线图(绝对差异 + 相对差异)

核心代码

ax1 = plt.subplots()[1] ax2 = ax1.twinx()
ax1.plot(...) # 左轴:绝对离差 ax2.plot(...) # 右轴:变异系数

图表逻辑

  • 左轴:绝对差异(单位:元)
  • 右轴:相对差异(无量纲)

为什么要双轴?

因为两个指标量纲不同,如果放在同一坐标轴:

  • 小数值会被压缩
  • 图形失真

双轴是处理这种问题的标准方法。


五、图3:多面板图(四类指标统一展示)

核心代码

fig, axes = plt.subplots(2, 2)
for coef in coefs: ax.plot(...)

展示内容

四个子图分别展示:

  • 相对平均离差
  • 加权平均离差
  • 变异系数
  • 加权变异系数

优点

  • 一张图展示四类指标
  • 结构清晰
  • 适合论文正文或结果分析

六、关键绘图细节

1. 去掉多余边框

ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False)

让图更简洁。


2. 添加网格线

ax.grid(axis='y', linestyle='--', alpha=0.6)

增强可读性,但不过度干扰。


3. 数值标注

ax.text(..., f'{value:.3f}')

提高信息表达能力。


七、完整代码(可直接运行)

import pandas as pd import matplotlib.pyplot as plt import numpy as np import warnings warnings.filterwarnings('ignore') # ================= 中文 + 期刊风格 ================= plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'Times New Roman'] plt.rcParams['axes.unicode_minus'] = False plt.rcParams['figure.dpi'] = 300 plt.rcParams['savefig.dpi'] = 300 colors = { 'Agdp': '#2E86AB', 'urban': '#A23B72', 'country': '#F18F01', 'urb': '#C73E1D' } coef_colors = { '相对平均离差': '#2E86AB', '加权平均离差': '#4A90E2', '变异系数': '#F18F01', '加权变异系数(威廉姆森系数)': '#C73E1D' } # ================= 数据 ================= data = { '年份': ['2007年','2007年','2007年','2007年', '2015年','2015年','2015年','2015年', '2024年','2024年','2024年','2024年'], '指标': ['Agdp','urban','country','urb']*3, '相对平均离差': [22480.4,6234.2,2933.7,0.624,5.9,10181.1,9323,0.87,12.99,15031.3,17943.5,0.81], '加权平均离差': [23643.5,5540.9,3768.7,0.523,6.78,11957.6,10605.7,0.98,13.01,14938.9,19725.8,0.86], '变异系数': [0.733,0.411,0.526,0.500,0.586,0.264,0.805,0.814,0.856,0.222,0.808,0.81], '加权变异系数(威廉姆森系数)': [0.732,0.390,0.576,0.442,0.635,0.298,0.877,0.879,0.802,0.219,0.847,0.83] } df = pd.DataFrame(data) years = ['2007年','2015年','2024年'] indicators = ['Agdp','urban','country','urb'] # ================= 图1:分组柱状图 ================= fig, ax = plt.subplots(figsize=(10,6)) bar_width = 0.18 x = np.arange(len(years)) for i, ind in enumerate(indicators): cv_vals = [df[(df['年份']==y)&(df['指标']==ind)]['变异系数'].values[0] for y in years] ax.bar(x+(i-1.5)*bar_width, cv_vals, width=bar_width, label=f'{ind}(CV)', color=colors[ind]) ax.set_title('变异系数分组柱状图') ax.set_xticks(x) ax.set_xticklabels(years) ax.legend() ax.grid(axis='y', linestyle='--', alpha=0.6) plt.tight_layout() plt.savefig('图1_柱状图.png') plt.close() # ================= 图2:双轴折线图 ================= fig, ax1 = plt.subplots(figsize=(10,6)) ax2 = ax1.twinx() country_data = df[df['指标']=='country'] # 左轴 ax1.plot(years, country_data['相对平均离差'], marker='o', label='相对平均离差', color=coef_colors['相对平均离差']) ax1.plot(years, country_data['加权平均离差'], marker='s', label='加权平均离差', color=coef_colors['加权平均离差']) # 右轴 ax2.plot(years, country_data['变异系数'], marker='^', linestyle='--', label='变异系数', color=coef_colors['变异系数']) ax2.plot(years, country_data['加权变异系数(威廉姆森系数)'], marker='*', linestyle='--', label='加权变异系数', color=coef_colors['加权变异系数(威廉姆森系数)']) # 图例合并 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1+lines2, labels1+labels2) ax1.set_title('农村收入差异双轴折线图') ax1.set_xlabel('年份') plt.tight_layout() plt.savefig('图2_双轴折线图.png') plt.close() # ================= 图3:多面板图 ================= fig, axes = plt.subplots(2, 2, figsize=(12,8)) axes = axes.flatten() coefs = ['相对平均离差','加权平均离差','变异系数','加权变异系数(威廉姆森系数)'] for idx, coef in enumerate(coefs): ax = axes[idx] for ind in indicators: vals = [df[(df['年份']==y)&(df['指标']==ind)][coef].values[0] for y in years] ax.plot(years, vals, marker='o', label=ind, color=colors[ind]) ax.set_title(coef) ax.grid(axis='y', linestyle='--', alpha=0.6) axes[-1].legend() plt.tight_layout() plt.savefig('图3_面板图.png') plt.close() print("图已生成:柱状图 / 双轴图 / 面板图")
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/2 3:13:01

Element Plus 与 AI 融合演进:Vue 中后台组件库的智能化转型研究

执行摘要 Element Plus 作为饿了么前端团队维护的 Vue 3 企业级组件库,在国内中后台开发领域占据主导地位。截至 2026 年初,其在 GitHub 已获得超过 2.5 万 Star,npm 周下载量达数十万次,是 Vue 3 项目开发的首选 UI 方案之一。 随…

作者头像 李华
网站建设 2026/7/2 3:03:26

3分钟解锁GitHub数学公式:让技术文档告别公式乱码

3分钟解锁GitHub数学公式:让技术文档告别公式乱码 【免费下载链接】github-mathjax 项目地址: https://gitcode.com/gh_mirrors/gi/github-mathjax 还在为GitHub上那些无法显示的数学公式而烦恼吗?想象一下,你正在阅读一篇关于机器学…

作者头像 李华
网站建设 2026/7/2 3:00:02

变身超人程序员

事情大概是这个样子的。有需求部门反应,我们部门负责的某个项目的页面上数据显示有问题。有10条数据,每页显示4条,那么正常情况下第1页应该显示4条,第2页4条,第3页2条。因为某一处代码抽风,现在数据被显示成…

作者头像 李华
网站建设 2026/7/2 2:58:53

delete from `后宫佳丽` where age>18

开始还自我感觉良好,后面我就发现不对了,每到周日,这个脚本一执行就是一整天,运行的时间有点长是小事,重点是这大好周日,我再想读这张表的数据,怎么也读不出来了,怎是一句空虚了得,我好难啊! 为什么 编不下去了,真实背景是公司中遇到的一张有海量数据表,每次一旦执行历史数据的…

作者头像 李华