Dan*_*son 5 python matplotlib legend pandas
我试图将两个图表绘制到一个图形上,两个图表都来自同一个数据框,但一个表示为堆积条形图,另一个表示为简单的折线图。
当我使用以下代码创建绘图时:
combined.iloc[:, 1:10].plot(kind='bar', stacked=True, figsize=(20,10))
combined.iloc[:, 0].plot(kind='line', secondary_y=True, use_index=False, linestyle='-', marker='o')
plt.legend(loc='upper left', fancybox=True, framealpha=1, shadow=True, borderpad=1)
plt.show()
随着combined数据帧寻找这样的:
我得到以下图像:
我试图将两个图例合二为一,并将图例放置在左上角,以便所有图表都可见。
有人可以解释为什么plt.legend()似乎只编辑与combined.iloc[:, 0]我的combined数据框切片相对应的折线图吗?如果有人能看到一种快速简便的组合和重新定位图例的方法,请告诉我!我将不胜感激。
通过True对自变量secondary_y的装置,该图将与双x轴的单独的轴实例创建,因为这产生了不同的轴实例的溶液通常是手动创建的图例,如在问题的答案链接由@ImportanceOfBeingErnest . 如果您不想直接创建图例,您可以通过在调用plt.legend()之间调用pandas.DataFrame.plot并存储结果来解决此问题。然后,您可以从两个轴实例中恢复手柄和标签。下面的代码是一个完整的例子
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.DataFrame({'x' : np.random.random(25), 
                   'y' : np.random.random(25)*5, 
                   'z' : np.random.random(25)*2.5})
df.iloc[:, 1:10].plot(kind='bar', stacked=True)
leg = plt.legend()
df.iloc[:, 0].plot(kind='line', y='x', secondary_y=True)
leg2 = plt.legend()
plt.legend(leg.get_patches()+leg2.get_lines(), 
           [text.get_text() for text in leg.get_texts()+leg2.get_texts()], 
           loc='upper left', fancybox=True, framealpha=1, shadow=True, borderpad=1)
leg.remove()
plt.show()
这将产生
并且应该很容易修改以适合您的特定用例。
或者,您可以使用matplotlib.pyplot.figlegend(),但您需要将legend = False所有调用传递给pandas.DataFrame.plot(),即
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
df = pd.DataFrame({'x' : np.random.random(25), 
                   'y' : np.random.random(25)*5, 
                   'z' : np.random.random(25)*2.5})
df.iloc[:, 1:10].plot(kind='bar', stacked=True, legend=False)
df.iloc[:, 0].plot(kind='line', y='x', secondary_y=True, legend=False)
plt.figlegend(loc='upper left', fancybox=True, framealpha=1, shadow=True, borderpad=1)
plt.show()
然而,这将默认将图例定位在轴外,但您可以通过bbox_to_anchor调用中的参数覆盖自动定位plt.figlegend()。
| 归档时间: | 
 | 
| 查看次数: | 604 次 | 
| 最近记录: |