如何在Python中绘制以DataFrame索引为折线的折线图?
实现按Bin分组的月度均值折线图
核心思路
你的DataFrame结构是索引为Bin分组,列代表月份(nr_1、nr_2...),要让每个Bin对应一条折线,需要先调整数据结构,让月份作为X轴维度,Bin作为折线系列。
方法一:用Pandas直接转置绘制
这是最简便的方式,通过转置DataFrame,让月份成为X轴刻度,每个Bin自动对应一条折线:
import pandas as pd import matplotlib.pyplot as plt # 替换为你的实际DataFrame df = pd.DataFrame( { 'nr_1': [5.2, 6.8, 8.1], 'nr_2': [5.5, 7.0, 8.3], 'nr_3': [5.7, 7.2, 8.5], 'nr_4': [6.0, 7.5, 8.8] }, index=['bin_0-10', 'bin_10-20', 'bin_20-30'] ) # 转置DataFrame:行变列,列变行 df_transposed = df.T # 绘制折线图 df_transposed.plot(kind='line', figsize=(10, 6), marker='o') # 自定义坐标轴与样式 plt.xlabel('月份') plt.ylabel('均值') plt.title('各Bin分组月度均值趋势') plt.legend(title='Bin分组') plt.grid(True, alpha=0.3) plt.show()
方法二:转成长格式用Seaborn绘制
如果需要更灵活的样式控制或后续扩展分析,可以将数据转成长格式,再用Seaborn绘制:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 替换为你的实际DataFrame df = pd.DataFrame( { 'nr_1': [5.2, 6.8, 8.1], 'nr_2': [5.5, 7.0, 8.3], 'nr_3': [5.7, 7.2, 8.5], 'nr_4': [6.0, 7.5, 8.8] }, index=['bin_0-10', 'bin_10-20', 'bin_20-30'] ) # 转成长格式:将Bin索引转为列,月份和均值拆分为单独列 df_long = df.reset_index().melt( id_vars='index', var_name='月份', value_name='均值' ) # 绘制折线图 plt.figure(figsize=(10, 6)) sns.lineplot(data=df_long, x='月份', y='均值', hue='index', marker='o') # 自定义样式 plt.xlabel('月份') plt.ylabel('均值') plt.title('各Bin分组月度均值趋势') plt.legend(title='Bin分组') plt.grid(True, alpha=0.3) plt.show()
关键说明
- 转置操作
df.T:直接互换原DataFrame的行与列,快速让月份成为X轴,Bin成为折线系列。 - 长格式转换:通过
reset_index()+melt()将宽表转成适合统计可视化的长表,更适合复杂场景。 - 样式调整:可以通过
plot()或lineplot()的参数自定义折线颜色、标记点、线宽等,比如添加color=['#FF5733', '#33FF57', '#3357FF']指定折线颜色。
内容的提问来源于stack exchange,提问作者MDYETI
相关产品推荐
相关产品推荐

