当前位置: 首页 > 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.gsyq.cn/news/1618276.html

相关文章:

  • NFD云解析插件扩展架构深度解析:从接口设计到实战实现
  • 在微服务中使用领域事件
  • 如何快速修复ClusterGVis中箱线图与折线图显示冲突问题
  • 心情值游戏系统实现
  • 【MO三维路径规划】麝牛算法MO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)【含Matlab源码 15684期】
  • [特殊字符] 搬砖的秘密:为什么一次搬 64 块砖最快?
  • 本地化AI漫剧制作:Qwen与ComfyUI实战指南
  • 一个老股民的十年自白十年炒股没亏,但我劝你别学我
  • Rust项目开发完整教程
  • 车间地坪养护秘籍
  • MAX9744与PIC18LF45K50的音频功率放大系统设计
  • 出现“WSL 安装似乎已损坏”的错误通常意味着Windows子系统对于Linux(WSL)的某些组件可能未正确安装或注册。要解决这个问题,你可以尝试以
  • 【新品发布】AI PC快充防护再进阶!艾为电子推出Type‑C OVP系列产品
  • Harness Engineering 实践案例:如何Agent 写一份行为规范
  • Docker网络配置详解
  • Rust模块管理最佳实践
  • 16266350800----wLa6twBAf4yVW4gw----dc_sid=b6eb97905a1c240e1675f230d913b6b5;HMACCOUNT=97C7CB558BC7424
  • 智能体设计范式:Plan-and-Solve
  • C++ 纳秒级交易系统设计
  • 毕业设计项目 基于深度学习的驾驶行为检测(玩手机)
  • 昇腾AI处理器上下文切换优化实践与性能提升
  • 报文发送非网络基本功能
  • 冻库低温环境下的机器人搬运技术测评
  • ASP.NET Core 之 Identity 入门(一)
  • 给阿嬤一封来自云端的信(上)
  • Python装饰器开发实践
  • 终极Win11系统优化指南:免费工具让你的Windows 11运行如飞
  • 游戏编程十年总结(下)
  • 第5章 Function Call 与工具调用框架《AI Agent 开发平台资深技术专家 AI Agent 应用架构师 CTO 面试题库详解》
  • 【安全】Sql注入漏洞的危害和防御