作者在无意间发现网上基于matplotlib的python库有关绘制各类型图标的教程质量参差不齐,大多都是重复度极高的文档搬运。
图表绘制+数据处理使人焦头烂额,但这又是各类数学建模比赛中常会遇见的需求场景。
故列出基于最近参加的数学建模中的实际应用举例,以下代码为统计不同时间段不同日期中各分拣中心的货量总和对比,可用于相似问题的图表绘制,作为总体预览对比图十分好用。
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from matplotlib.ticker import MaxNLocator
# 设置中文字体,确保中文可以正常显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取CSV文件内容到DataFrame
data = pd.read_csv('1.csv')
# 将时间转换为Pandas的datetime格式
data['time'] = pd.to_datetime(data['time'])
# 1. 统计不同物流中心,不同时间段的货量总和
grouped_by_center_and_hour = data.groupby(['name', 'hours'])['goods'].sum().reset_index()
# 绘制柱状图
fig1, ax1 = plt.subplots(figsize=(20, 8)) # 创建一个新的figure对象
sns.barplot(x='hours', y='goods', hue='name', data=grouped_by_center_and_hour, ax=ax1, palette="tab20")
ax1.set_title('各分拣中心不同时间段货量总和对比图')
ax1.set_xlabel('时间段 (小时)')
ax1.set_ylabel('货量总和')
ax1.xaxis.set_major_locator(MaxNLocator(integer=True))
# 将图例绘制在右上角,并分为三列
handles, labels = ax1.get_legend_handles_labels()
# 微调图例的位置,使其位于右上角的空白处
bbox_to_anchor = (1.0, 0.7) # (x1, y1) in fraction of axes
# 由于图例默认是相对于图表的,我们需要将其调整到相对于图表外的右上角
# 这里我们将图例的x坐标和y坐标都设置为1.1,稍微超出图表范围,以便放在右上角
ax1.legend(handles, labels, loc='center left', bbox_to_anchor=bbox_to_anchor, ncol=3, framealpha=0.5)
# 显示柱状图
plt.show()
# 2. 统计不同物流中心,不同日期的货量总和
grouped_by_center_and_date = data.groupby(['name', pd.Grouper(key='time', freq='D')])['goods'].sum().reset_index()
# 绘制折线图
fig2, ax2 = plt.subplots(figsize=(20, 8)) # 创建另一个新的figure对象
sns.lineplot(x='time', y='goods', hue='name', data=grouped_by_center_and_date, marker='o', ax=ax2, palette="tab20")
ax2.set_title('各分拣中心不同日期区间货量总和对比图')
ax2.set_xlabel('日期')
ax2.set_ylabel('货量总和')
# 将图例绘制在右上角,并分为三列
handles, labels = ax2.get_legend_handles_la
bels()
# 微调图例的位置,使其位于右上角的空白处
bbox_to_anchor = (1.0, 0.7)
ax2.legend(handles, labels, loc='center left', bbox_to_anchor=bbox_to_anchor, ncol=3, framealpha=0.5)
# 显示折线图
plt.show()
代码运行示意图:
(这个图画的我十分满意,坐标清晰,图例清楚,太赏心悦目了)
csv部分图表数据:
以上代码稍微修修补补就可以用于各种数学建模中要求统计对比数据的场景。
各位cv工程师看完觉得有用记得留个赞~ ;)