gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 23:08:48 30 4
gpt4 key购买 nike

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

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

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数据框如下所示:

source data frame

我得到以下图像:

stacked bar chart with line number of CVEs overlaid

我正在尝试将两个图例合并为一个,并将图例放置在左上角,以便所有图表都可见。

谁能解释一下为什么 plt.legend()似乎只是在编辑与 combined.iloc[:, 0] 相对应的折线图我的 combined 的一部分数据框?如果有人能看到一种快速简便的方法来组合和重新定位图例,请告诉我!我将不胜感激。

最佳答案

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

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()
这将产生
enter image description here
并且应该很容易修改以适合您的特定用例。
或者,您可以使用 matplotlib.pyplot.figlegend() ,但您需要通过 legend = False在对 pandas.DataFrame.plot() 的所有调用中, IE。
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() 中的参数.

关于python - 在 matplotlib 和 pandas 中组合和重新定位两个图表的图例的困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60352231/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com