matplotlib多子图使用计数器作为图例显示为0如何修复
问题根因
你在调用pandas的plot()方法时错把计数器值传给了legend参数,该参数仅支持布尔值,作用是控制图例是否显示,传整数会被自动转为布尔值(非0即True),图例默认会取用Series的索引值作为标签,所以所有图例都显示为0。自定义图例标签需要传给label参数。
另外原代码还有一处拼写错误:plot_kernels函数的入参是mydict2,但循环中误用为my_dict2,会触发变量未定义报错,也需要同步修复。
修复后完整代码
import pandas as pd import matplotlib.pyplot as plt def plot_dataframe(df, cnt): row = df.iloc[0].astype(int) # 取dataframe第一行 # 绘制折线子图 plt.subplot(2, 1, 1) # 自定义标签传label参数,同时设置legend=True显示图例 row.plot(legend=True, label=str(cnt)) # 绘制柱状图子图 plt.subplot(2, 1, 2) df2 = row.value_counts() df2.reindex().plot(kind='bar', legend=True, label=str(cnt)) def plot_kernels(mydict2): plt.figure(figsize=(20, 15)) cnt=1 # 修复拼写错误:用入参名mydict2替代错误的my_dict2 for key in mydict2: df = mydict2[key] plot_dataframe(df, cnt) cnt = cnt + 1 plt.show()
可选优化
如果需要提升图表可读性,可给两个子图分别添加标题,修改示例如下:
def plot_dataframe(df, cnt): row = df.iloc[0].astype(int) plt.subplot(2, 1, 1) plt.title("数值折线图") row.plot(legend=True, label=str(cnt)) plt.subplot(2, 1, 2) plt.title("数值分布柱状图") df2 = row.value_counts() df2.reindex().plot(kind='bar', legend=True, label=str(cnt))
内容的提问来源于stack exchange,提问作者mahmood
相关产品推荐
相关产品推荐

