在 matplotlib 和 pandas 中组合和重新定位两个图表的图例的困难

Posted

技术标签:

【中文标题】在 matplotlib 和 pandas 中组合和重新定位两个图表的图例的困难【英文标题】:Difficulty combining and repositioning the legends of two charts in matplotlib and pandas 【发布时间】:2020-06-06 16:26:26 【问题描述】:

我正在尝试将两个图表绘制到一个图形上,两个图表都来自同一个数据框,但一个表示为堆积条形图,另一个表示为简单的折线图。

当我使用以下代码创建绘图时:

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 数据框的combined.iloc[:, 0] 切片相对应的折线图吗?如果有人能看到一种快速简便的方法来组合和重新定位图例,请告诉我!我将不胜感激。

【问题讨论】:

检查***.com/questions/5484922/… 【参考方案1】:

为参数 secondary_y 传递 True 意味着绘图将在具有双 x 轴的单独轴实例上创建,因为这会创建不同的轴实例,解决方案通常是手动创建图例,如@ImportanceOfBeingErnestlinked 问题的答案。如果您不想直接创建图例,您可以通过在调用 pandas.DataFrame.plot 之间调用 plt.legend() 并存储结果来解决此问题。然后,您可以从两个轴实例中恢复手柄和标签。下面的代码就是一个完整的例子

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(),但您需要在所有对pandas.DataFrame.plot() 的调用中将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()

然而,这将默认将图例定位在轴之外,但您可以在调用 plt.figlegend() 时通过 bbox_to_anchor 参数覆盖自动定位。

【讨论】:

以上是关于在 matplotlib 和 pandas 中组合和重新定位两个图表的图例的困难的主要内容,如果未能解决你的问题,请参考以下文章

Matplotlib与Pandas结合时对fig、ax、plt的理解

matplotlib plot参数

如何在 python 中使用 matplotlib 和 pandas 绘制 CSV 数据

Python中Pandas/Matplotlib中直方图和密度的叠加

使用 pandas 或 matplotlib 在 IPython 笔记本中绘制性别图表

python pandas和matplotlib安装冲突[重复]