使用Matplotlib绘制具有中文字体与自定义样式的折线图

在数据分析和可视化领域,matplotlib是一个强大且广泛使用的Python库。下面的文章将详细阐述如何利用matplotlib绘制一张包含中文标签、自定义样式及注解的折线图,并展示了从2023年33周至2024年42周的数据变化趋势。

先看示例:

在这里插入图片描述

首先,我们需要导入必要的库并设置matplotlib支持中文字体显示:

import matplotlib.pyplot as plt
import numpy as np

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

接下来,我们有一组数据,包含了每周的具体数值:

data = [...]
weeks, values = zip(*data)

在对数据进行初步处理后,我们找出最大值、最小值及其索引,以便后续标注。然后,我们为线条设定颜色和样式,并创建一个新的figure以开始绘图操作。这里特别设置了figure的背景色以及子图的边距,使图表布局更加美观:

# 创建figure并调整布局
plt.figure(facecolor='lightgray')
plt.subplots_adjust(left=0.12, right=0.9, bottom=0.3, top=0.9)

为了清晰展示数据趋势,我们绘制了一条带有圆点标记的折线图,并进行了详细的样式定制,包括轴标签、标题字体大小,坐标轴刻度、网格线样式以及额外的顶部和底部空间:

# 绘制折线图并设置相关属性
plt.plot(weeks, values, 'o-', markersize=6)

# 添加轴标签、标题及设置字体大小
plt.xlabel('Year-Week', fontsize=14)
plt.ylabel('Value', fontsize=14)
plt.title('2023年33周至2024年42周的折线图', fontsize=16)

# 设置坐标轴刻度、网格线及额外空间
plt.grid(color='silver', linestyle='-.', linewidth=0.5)
plt.tick_params(labelsize=12) 
plt.margins(y=0.3)

进一步地,我们在最大值、最小值位置添加了注解,同时也标注了数据序列中的最后一个点的值。为了让x轴标签更易于阅读,我们将它们旋转45度:

# 在关键点处添加注解
# ...注解代码段...

# 设置x轴标签并旋转
plt.xticks(range(len(weeks)), weeks, rotation=45)

最后,虽然示例中未明确执行此步骤,但在实际应用中可能需要根据数据范围手动设置y轴的最小值和最大值,以更好地聚焦于感兴趣的区间:

# 设置y轴显示范围(未在此实例中启用)
# y_min_desired = 12.0
# y_max_desired = 16.0
# plt.ylim(ymin=y_min_desired, ymax=y_max_desired)

完成所有配置后,调用plt.show()展示最终绘制好的折线图。通过以上步骤,我们成功构建了一个既专业又直观的数据可视化图表,有效地传达了指定时间段内数据的变化情况。

完整代码示例

更我请访问gitree仓库 https://gitee.com/mrhailong/huimayun-project

import matplotlib.pyplot as plt
import numpy as np

# 设置matplotlib支持中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 无衬线黑体
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 数据转换为列表形式,每项是一个元组,包含年周和对应的数值
data = [
    ('2023年33周', 14.47),
    ('2023年34周', 14.39),
    ('2023年35周', 14.4),
    ('2023年36周', 14.19),
    ('2023年37周', 14.13),
    ('2023年38周', 13.91),
    ('2023年39周', 13.91),
    ('2023年40周', 13.43),
    ('2023年41周', 13.65),
    ('2023年42周', 13.86),
    ('2024年3周', 12.75),
    ('2024年4周', 13.31),
    ('2024年5周', 14.0)
]

weeks, values = zip(*data)

# 找出最大值和最小值及其索引
y_max_val = max(values)
y_min_val = min(values)
y_max_idx = values.index(y_max_val)
y_min_idx = values.index(y_min_val)

# 设置线条颜色和样式
line_color = 'tab:blue'  # 使用matplotlib内置颜色名称
line_style = '-o'  # 线条实线且带有圆点标记

# 创建一个新的figure,并设置其背景颜色
plt.figure(facecolor='lightgray')

# 创建figure并添加一个子图
# fig, ax = plt.subplots(figsize=(10, 6))
# 调整子图间距及边框大小(边距)
plt.subplots_adjust(left=0.12, right=0.9, bottom=0.3, top=0.9)

# 绘制折线图并设置样式
# plt.plot(weeks, values, line_style, color=line_color, linewidth=2.5, markersize=6)

# 添加轴标签和标题,设置字体大小
plt.xlabel('Year-Week', fontsize=14)
plt.ylabel('Value', fontsize=14)
plt.title('Line Plot with Custom Style', fontsize=16)

# 设置坐标轴刻度及网格线样式
plt.grid(color='silver', linestyle='-.', linewidth=0.5)
plt.tick_params(labelsize=12) 

# 设置上下边界额外空间的比例(例如,10%)
plt.margins(y=0.3)  # 假设我们想要10%的顶部和底部额外空间


# 绘制折线图     
plt.plot(weeks, values, 'o-', markersize=6)

# 在最大值和最小值处添加注解
plt.annotate(f'Max: {y_max_val:.2f}', xy=(y_max_idx, y_max_val), xytext=(5, 5), textcoords='offset points',
             ha='center', va='bottom', rotation=0, fontsize=10)
plt.annotate(f'Min: {y_min_val:.2f}', xy=(y_min_idx, y_min_val), xytext=(5, 15), textcoords='offset points',
             ha='center', va='top', rotation=0, fontsize=10)

# 最后一个点也加上标签值
last_idx = len(values) - 1
y_last_val = values[last_idx]
plt.annotate(f'Last: {y_last_val:.2f}', xy=(last_idx, y_last_val), xytext=(-5, 5 if y_last_val > y_min_val else -15), 
             textcoords='offset points', ha='center', va='bottom' if y_last_val > y_min_val else 'top', rotation=0, fontsize=10)

# 设置x轴标签并旋转以更好展示
plt.xticks(range(len(weeks)), weeks, rotation=45)

# 设置图形显示范围及美化其他元素
plt.xlabel('Year-Week')
plt.ylabel('Value')
plt.title('2023年33周至2024年42周的折线图')

# 设置y轴的最小值和最大值
# y_min_desired = 12.0
# y_max_desired = 16.0
# plt.ylim(ymin=y_min_desired, ymax=y_max_desired)

# 显示图形
plt.show()
  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值