【问题标题】:Why I have two legends ? How to fusion the legends ? Python为什么我有两个传说?如何融合传奇? Python
【发布时间】:2021-03-04 15:22:21
【问题描述】:

我正在用这种方法绘制 2 个数据框:

df.plot(ax=ax, x='x', y='y', label = "first_df")
df2.plot(ax=ax, x='x', y='y', label = "second_df")

我添加了一些 avxspan 函数:

plt.axvspan(x, y, label = value)

由于我有多个 avxspan 并且还有重复的值,我正在使用此代码来唯一地显示这些值。

handles, labels = plt.gca().get_legend_handles_labels()
by_label = dict(zip(labels, handles))            
plt.legend(by_label.values(), by_label.keys(),loc='upper center', bbox_to_anchor=(1.1, 0.8))

但是当我显示图例时,我有一个用于 dfs 的图例和另一个用于 avxspan 函数的图例。我想是因为我用plot 为dfs 和plt 为axvspan,所以我不知道如何融合图例。

艾迪丝:

我用 ax1 et ax2 为我的 dfs 尝试了这个:

h1, l1 = ax1.get_legend_handles_labels()
h2, l2 = ax2.get_legend_handles_labels()
ax1.legend((h1+h2), l1+l2, loc='upper center', bbox_to_anchor=(1.1, 0.8))

它正在工作,但我在图例中有重复,我该如何删除它?

【问题讨论】:

  • dataframe.plot 有一个 legend 参数接受一个布尔值。

标签: python pandas dataframe matplotlib


【解决方案1】:

您可以使用ax.plot,而不是使用df.plot(在调用时创建图例):

ax.plot(df['x'], df['y'], label='first df')
ax.plot(df2['x'], df2['y'], label='second df')

ax.legend()

【讨论】:

  • 我不知道你在追求什么。尝试包含最少的样本数据和预期的输出。
  • 曲线是函数,但要跟踪多个 axvspan 函数,我对每个值使用 for 循环。但在传说中我有重复
【解决方案2】:

在以下示例中,通过将所有内容绘制到相同的轴上来组合图例,包括带有 ax.avxspan 的 avxspan,然后运行 ​​ax.legend 以将 avxspan 图例添加到现有图例:

import numpy as np   # v 1.19.2
import pandas as pd  # v 1.2.3

# Create sample dataset
rng = np.random.default_rng(seed=1)
size = 30
df = pd.DataFrame(dict(x=range(size), y=rng.integers(0, 100, size=size)))
df2 = pd.DataFrame(dict(x=range(size), y=rng.integers(10, 50, size=size)))

# Plot data unto single Axes with combined legend using multiple plotting functions
ax = df.plot(x='x', y='y', label='first_df', figsize=(8,4))
df2.plot(ax=ax, x='x', y='y', label = 'second_df')
ax.axvspan(10, 15, label='span', facecolor='black', edgecolor=None, alpha=0.2)
ax.legend(loc='upper right');

【讨论】:

  • 感谢 Patrick,但对于第二个 df,我有一个不同的 Y 轴和 X 轴是共享的。
  • @ThonyNadhir 您能否编辑您的问题以显示更多用于生成图形的代码?目前尚不清楚是否存在不同的 y 轴,并且数据框的绘图函数都包括 ax=ax ,它与您最后一个代码 sn-p 不匹配图例。一旦您提供了更多详细信息,我将很乐意编辑我的答案以提供适合您的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
  • 2012-10-11
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多