Python绘制图表用于论文写作(条形图)

目录

0 前言

1 问题背景

2 问题解决

2.1 混合使用字体

2.2 全部使用黑体

2.3 自动选择使用字体


0 前言

        🙋欢迎光临我的博客!我衷心希望这里的分享能够对你有所帮助。祝愿你拥有美好的一天!☀️☀️☀️

1 问题背景

         这是一个很有意思的现象:我们平时绘制论文表格时,通常只会选用一种字体——比如全部用黑体,或者全部用新罗马。但有时候,为了更清晰地展示信息,我们可能会需要混合使用不同的字体。

        如果你也遇到过这样的需求,那么今天这篇博客,就是为你准备的。

2 问题解决

2.1 混合使用字体

        这里我们以常见的搭配为例,将中文字体(黑体)与英文字体(Times New Roman)结合使用,具体代码如下:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib
import matplotlib.font_manager as fm

# 设置后端
matplotlib.use('Agg')

# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体为黑体
plt.rcParams['font.family'] = 'sans-serif'  # 使用无衬线字体
plt.rcParams['mathtext.fontset'] = 'stix'  # 设置数学公式字体
plt.rcParams['mathtext.rm'] = 'Times New Roman'  # 设置数学公式中的普通字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 查找Times New Roman字体
times_font = None
for font in fm.fontManager.ttflist:
    if 'times new roman' in font.name.lower():
        times_font = font.fname
        break

if times_font is None:
    times_font = 'DejaVu Serif'

# 句子分词
words = ["这篇", "博客", "很有", "意思", "。", "祝你", "今天", "过的", "愉快", "!", "哈哈"]

# 注意力权重
attention_weights = [0.15, 0.21, 0.26, 0.18, 0.03, 0.11, 0.15, 0.21, 0.22, 0.09, 0.02,]

# 创建图形和轴
fig, ax = plt.subplots(figsize=(14, 8))

# 绘制条形图
bars = ax.bar(range(len(words)), attention_weights, color='#4C72B0', width=0.6)

# 设置y轴范围和刻度
ax.set_ylim(0, 0.35)
ax.set_yticks(np.arange(0, 0.36, 0.05))

# 设置x轴刻度和标签
ax.set_xticks(range(len(words)))
ax.set_xticklabels(words)

# 为每个条形添加数值标签 - 确保每个条形只有一个标签
for i, weight in enumerate(attention_weights):
    # 计算标签的x和y位置
    x_pos = i
    y_pos = weight + 0.012  # 统一的垂直偏移量

    # 添加文本标签 - 直接使用ax.text,确保只添加一次
    ax.text(x_pos, y_pos, f'{weight:.2f}',
            ha='center', va='bottom',
            fontsize=10, color='black',
            fontproperties=fm.FontProperties(fname=times_font))

# 设置标题
title = ax.set_title(
    'Figure 1. The example sentence',
    fontsize=16, pad=20, fontweight='bold')
title.set_fontproperties(fm.FontProperties(fname=times_font, size=16))

# 设置Y轴标签
ylabel = ax.set_ylabel('Attention Weight', fontsize=14, fontweight='bold')
ylabel.set_fontproperties(fm.FontProperties(fname=times_font, size=14))

# 设置X轴标签
xlabel = ax.set_xlabel('Words', fontsize=14, fontweight='bold')
xlabel.set_fontproperties(fm.FontProperties(fname=times_font, size=14))

# 旋转x轴标签
plt.setp(ax.get_xticklabels(), rotation=45, ha='right', fontsize=12)

# 设置Y轴刻度标签字体
for label in ax.get_yticklabels():
    label.set_fontproperties(fm.FontProperties(fname=times_font, size=12))

# # 添加水平网格线
# ax.yaxis.grid(True, linestyle='--', alpha=0.3, linewidth=0.5)

# 移除上方和右侧的边框线
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# 调整布局
plt.tight_layout()

# 保存图片
plt.savefig('picture.png', dpi=300, bbox_inches='tight')
print("图形已成功保存为 'picture.png'")

        最终的效果看起来是这样的:

2.2 全部使用黑体

        使用单一字体(如全黑体)进行绘图时,通常能确保视觉风格的高度统一,尤其适用于强调简洁、规整或现代感的图表场景。具体代码如下:

import matplotlib.pyplot as plt
import numpy as np
import matplotlib

# 设置后端
matplotlib.use('Agg')

# 设置字体 - 全部使用黑体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 中文字体为黑体
plt.rcParams['font.family'] = 'sans-serif'  # 使用无衬线字体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 句子分词
words = ["这篇", "博客", "很有", "意思", "。", "祝你", "今天", "过的", "愉快", "!", "哈哈"]

# 注意力权重
attention_weights = [0.15, 0.21, 0.26, 0.18, 0.03, 0.11, 0.15, 0.21, 0.22, 0.09, 0.02]

# 创建图形和轴
fig, ax = plt.subplots(figsize=(14, 8))

# 绘制条形图
bars = ax.bar(range(len(words)), attention_weights, color='#4C72B0', width=0.6)

# 设置y轴范围和刻度
ax.set_ylim(0, 0.35)
ax.set_yticks(np.arange(0, 0.36, 0.05))

# 设置x轴刻度和标签
ax.set_xticks(range(len(words)))
ax.set_xticklabels(words)

# 为每个条形添加数值标签 - 确保每个条形只有一个标签
for i, weight in enumerate(attention_weights):
    # 计算标签的x和y位置
    x_pos = i
    y_pos = weight + 0.012  # 统一的垂直偏移量

    # 添加文本标签 - 使用黑体
    ax.text(x_pos, y_pos, f'{weight:.2f}',
            ha='center', va='bottom',
            fontsize=10, color='black')

# 设置标题 - 中文标题
title = ax.set_title(
    '图1. 示例',
    fontsize=16, pad=20, fontweight='bold')

# 设置Y轴标签 - 中文
ylabel = ax.set_ylabel('注意力权重', fontsize=14, fontweight='bold')

# 设置X轴标签 - 中文
xlabel = ax.set_xlabel('词语', fontsize=14, fontweight='bold')

# 旋转x轴标签
plt.setp(ax.get_xticklabels(), rotation=45, ha='right', fontsize=12)

# 设置Y轴刻度标签字体大小
for label in ax.get_yticklabels():
    label.set_fontsize(12)

# 移除上方和右侧的边框线
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# 调整布局
plt.tight_layout()

# 保存图片
plt.savefig('picture.png', dpi=300, bbox_inches='tight')
print("图形已成功保存为 'picture.png'")

        具体输出结果如下:

2.3 自动选择使用字体

        为简化流程,我们可以将字体选择交给程序自动配置,这往往能得到更协调且省心的结果😄

import matplotlib.pyplot as plt
import numpy as np
import matplotlib


# 设置后端
matplotlib.use('Agg')

# 使用字体列表实现回退
# Matplotlib会按顺序尝试列表中的字体,直到找到能显示字符的字体
plt.rcParams['font.family'] = ['Times New Roman', 'SimHei', 'DejaVu Sans']
plt.rcParams['axes.unicode_minus'] = False

# 句子分词
words = ["这篇", "博客", "很有", "意思", "。", "祝你", "今天", "过的", "愉快", "!", "哈哈"]

# 注意力权重
attention_weights = [0.15, 0.21, 0.26, 0.18, 0.03, 0.11, 0.15, 0.21, 0.22, 0.09, 0.02]

# 创建图形和轴
fig, ax = plt.subplots(figsize=(14, 8))

# 绘制条形图
bars = ax.bar(range(len(words)), attention_weights, color='#4C72B0', width=0.6)

# 设置y轴范围和刻度
ax.set_ylim(0, 0.35)
ax.set_yticks(np.arange(0, 0.36, 0.05))

# 设置x轴刻度和标签
ax.set_xticks(range(len(words)))
ax.set_xticklabels(words)

# 为每个条形添加数值标签 - 数字会自动使用Times New Roman
for i, weight in enumerate(attention_weights):
    x_pos = i
    y_pos = weight + 0.012

    ax.text(x_pos, y_pos, f'{weight:.2f}',
            ha='center', va='bottom',
            fontsize=10, color='black')

# 设置标题 - 混合中英文
title_text = 'Figure 1. 权重可视化'
ax.set_title(title_text, fontsize=16, pad=20, fontweight='bold')

# 设置Y轴标签 - 英文会自动使用Times New Roman
ax.set_ylabel('Attention', fontsize=14, fontweight='bold')

# 设置X轴标签 - 中文会自动使用黑体
ax.set_xlabel('Words', fontsize=14, fontweight='bold')

# 旋转x轴标签
plt.setp(ax.get_xticklabels(), rotation=45, ha='right', fontsize=12)

# 移除上方和右侧的边框线
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# 调整布局
plt.tight_layout()

# 保存图片
plt.savefig('picture_font_fallback.png', dpi=300, bbox_inches='tight')
print("图形已成功保存为 'picture_font_fallback.png'")
print("字体设置: Times New Roman (主要) -> SimHei (中文回退) -> DejaVu Sans (备用)")

        具体效果如下:

        以上就是本次关于图表字体应用的分享。目前,我们主要以条形图为例进行了演示,但文中涉及的字体配置方法与设计思路,同样适用于折线图、饼图等其他常见图表类型。大家可以根据实际需求,举一反三,灵活替换。

结语: 恭喜你完成了这篇博客的阅读!我衷心希望我的分享能够为你带来启发和帮助。愿你拥有一个宁静而美好的夜晚,好梦相伴。🌛🌛🌛

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值