代码分解说明(对照你的课本理解)
1. 基础准备部分
import pandas as pd
import matplotlib.pyplot as plt
# 设置中文显示(Windows系统)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 让图表能显示中文
plt.rcParams['axes.unicode_minus'] = False # 解决负号"-"显示为方块的问题
-
类比:就像你要写作业,先准备好笔和纸(导入库),再调整纸张格式让中文字能写清楚(设置字体)。
-
常见问题:如果不设置中文,图表中的中文会显示为小方块。
2. 读取数据部分
file_path = r"自己保存的位置\医院药品销售数据.xlsx"
df = pd.read_excel(file_path, sheet_name='按月份的销售额汇总')
-
作用:从Excel文件中读取数据
-
比喻:就像打开一个Excel文件,找到名叫"按月份的销售额汇总"的工作表
-
参数说明:
-
r"路径"
:r
表示防止路径中的\
被转义(比如\n
会被认为是换行符) -
sheet_name
:指定要读取的工作表名称
-
3. 创建画布
fig, ax = plt.subplots(figsize=(12, 6)) # 调整画布尺寸
-
比喻:准备一张画纸(
fig
是整张画纸,ax
是画纸上的绘图区域) -
参数:
-
figsize=(12,6)
:画布尺寸为12英寸宽、6英寸高(1英寸≈2.54厘米)
-
-
对比理解:
-
旧代码的
plt.plot()
是快速画图,但控制细节不方便 -
新代码的
ax
对象可以精细控制每一个图表元素
-
4. 绘制折线图
line = ax.plot(
df['月份'], # X轴数据
df['销售金额'], # Y轴数据
color='#2B7FC3', # 线条颜色(蓝色)
linewidth=2, # 线宽
marker='o', # 数据点标记为圆形
markersize=8, # 标记大小
markerfacecolor='white', # 标记内部颜色
markeredgewidth=2, # 标记边框粗细
label='月销售额' # 图例标签
)
-
可视化效果:你会看到一条蓝色折线,每个数据点有白色圆点标记
-
关键参数:
-
marker
:可以换成^
(三角形)、s
(方形)等 -
label
:后续图例显示的文本
-
5. 添加图表元素
ax.set_title('2023年度药品销售趋势分析', fontsize=16, pad=20) # 标题
ax.set_xlabel('月份', fontsize=12) # X轴标签
ax.set_ylabel('销售金额(元)', fontsize=12) # Y轴标签
效果:
|---------------- 标题 ----------------|
| |
| 销售金额(元) |
| ▲ |
| │ |
| └───────────────────────────────►
| 月份
6. 设置坐标轴刻度
ax.set_xticks(df['月份']) # 设置X轴刻度位置
# 将数字月份转换为"1月"、"2月"格式,并旋转45度防重叠
ax.set_xticklabels([f'{int(month)}月' for month in df['月份']], rotation=45)
ax.tick_params(axis='both', labelsize=10) # 统一设置刻度标签大小
-
重点理解:
-
set_xticks
:确定刻度线位置(比如1月的位置在X轴1的位置) -
set_xticklabels
:自定义显示的文本内容 -
rotation=45
:防止月份文字拥挤重叠
-
7. 其他优化功能
# 网格线
ax.grid(True, linestyle='--', linewidth=0.5, alpha=0.6, color='gray')
# 突出显示最高/最低点(带箭头标注)
# 保存图片优化
plt.savefig('文件名.png', dpi=300, bbox_inches='tight', facecolor='white')
-
网格线参数:
-
linestyle='--'
:虚线样式 -
alpha=0.6
:透明度(1为完全不透明)
-
-
保存图片:
-
dpi=300
:高分辨率保存(适合打印) -
bbox_inches='tight'
:去除图片周围的白边
完整代码
-
import pandas as pd
import matplotlib.pyplot as plt
# 设置中文显示(Windows系统)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 1. 数据读取优化(建议使用相对路径)
file_path = r"D:\Python\python学习\医院药品销售数据.xlsx"
df = pd.read_excel(file_path, sheet_name='按月份的销售额汇总')
# 2. 创建画布和坐标轴对象(面向对象方式)
fig, ax = plt.subplots(figsize=(12, 6)) # 调整画布尺寸
# 3. 绘制折线图并优化样式
line = ax.plot(
df['月份'],
df['销售金额'],
color='#2B7FC3', # 使用品牌蓝色
linewidth=2,
marker='o', # 添加数据点标记
markersize=8,
markerfacecolor='white',
markeredgewidth=2,
label='月销售额'
)
# 4. 添加图表元素
ax.set_title('2023年度药品销售趋势分析', fontsize=16, pad=20)
ax.set_xlabel('月份', fontsize=12)
ax.set_ylabel('销售金额(元)', fontsize=12)
# 5. 设置坐标轴刻度
ax.set_xticks(df['月份'])
ax.set_xticklabels([f'{int(month)}月' for month in df['月份']], rotation=45) # 转换为中文月份标签
ax.tick_params(axis='both', labelsize=10)
# 6. 添加网格线
ax.grid(True,
linestyle='--',
linewidth=0.5,
alpha=0.6,
color='gray')
# 7. 突出显示极值点
max_val = df['销售金额'].max()
min_val = df['销售金额'].min()
for idx, row in df.iterrows():
if row['销售金额'] == max_val:
ax.annotate(f'最高点: {max_val:,.2f}',
(row['月份'], max_val),
xytext=(15, 15),
textcoords='offset points',
arrowprops=dict(arrowstyle='->', color='red'),
color='red')
elif row['销售金额'] == min_val:
ax.annotate(f'最低点: {min_val:,.2f}',
(row['月份'], min_val),
xytext=(-15, -30),
textcoords='offset points',
arrowprops=dict(arrowstyle='->', color='green'),
color='green')
# 8. 添加图例
ax.legend(loc='upper left', fontsize=10)
# 9. 自动调整布局
plt.tight_layout()
# 10. 保存图片优化
save_path = '按月份的销售额_优化版.png'
plt.savefig(
save_path,
dpi=300, # 提高分辨率
bbox_inches='tight', # 去除多余白边
facecolor='white' # 设置背景色
)
# 11. 显示图表(可选)
plt.show()