当前位置: 首页 > news >正文

用 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("图已生成:柱状图 / 双轴图 / 面板图")
http://www.jsqmd.com/news/1106304/

相关文章:

  • 一个由进程内存布局异常引起的问题
  • 容器资源限制与配额管理实践
  • 在微服务中使用领域事件
  • 前面定义的一些类也要改一下。
  • NFD云解析插件扩展架构深度解析:从接口设计到实战实现
  • hybrik实时性测试
  • 数智中台全链路交付,赋能连锁零售规模化增长
  • Linux课后练习——管理“学习笔记”项目操作过程
  • 2026年真正免费的论文查重网站有哪些?7个平台实测+防骗指南
  • 如何快速修复ClusterGVis中箱线图与折线图显示冲突问题
  • TypeScript泛型
  • 【MO三维路径规划】麝牛算法MO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)【含Matlab源码 15684期】
  • langchain4j 学习系列(10)-Skill使用示例
  • LinuxShell编程基础学习笔记
  • 2026年无线物联网融合网络设备十大品牌排行榜
  • 量子优化算法FPC-QAOA:突破参数爆炸难题
  • 35岁转行AI大模型:挑战、机遇与实战路径
  • 服务端开发爱好者
  • 心情值游戏系统实现
  • [特殊字符] 搬砖的秘密:为什么一次搬 64 块砖最快?
  • 车间地坪养护秘籍
  • Rust项目开发完整教程
  • 从WAIC看AI办公新趋势:会议助手正在从“记录工具”变成“组织智能体”
  • Rust语言基础开发教程
  • 一个老股民的十年自白十年炒股没亏,但我劝你别学我
  • 本地化AI漫剧制作:Qwen与ComfyUI实战指南
  • 从 VMware 迁移到 Proxmox VE 的完整方案
  • MAX9744与PIC18LF45K50的音频功率放大系统设计
  • Vue组件开发技巧
  • 单系统登录机制