【问题标题】:Move the legend for xarray plot lines in python在python中移动xarray绘图线的图例
【发布时间】:2022-04-01 21:33:51
【问题描述】:

我在 python 中使用 xarray 来绘制一个 DataArray,其中包含几个面板,每个面板都绘制多条线(色调)。默认情况下,图例的位置设置在面板的右侧。我正在尝试找到一种方法将其移动到面板的顶部或底部。

我对 plot.pcolormesh 没有问题,因为参数 cbar_kwargs={'orientation': 'horizo​​ntal'} 效果很好,但它是否存在与 plot.line() 类似的东西? 我查看了文档,但找不到任何相关内容。

作为一个例子,这是我使用的代码(非常简单):

p = dataArray.plot.line(
    y="z",
    hue="source",
    col="t",
    col_wrap=4,
)
plt.gca().invert_yaxis()
plt.draw()
plt.show()

产生这个figure

感谢您的帮助。

编辑。 根据其他地方的建议,我探索了一些问题。

Xarray 创建一个 FacetGrid 对象(来自 seaborn 库)。该对象包含一个自动添加图例(由 xarray 使用)的功能,以使用绘制图例对象的右侧面板扩展图形。我想出了如何访问这个对象(p.figlegend),它本身具有属性set_bbox_to_anchor,它确实允许移动图例......但仅相对于这个附加面板.

现在我有了图例对象,我可以将它完全移动到我想要的任何位置,但这并不是我真正想要的选项。首先,如果我这样做,我将不得不从头开始创建图例对象,这是我想通过使用 xarray 自动线图来避免的,其次我将在我的图形右侧有一个小的空面板。此时从子图创建图形并一张一张地制作面板会更容易。

我认为我的问题可以简单地简化为:是否有可能有一个 FacetGrid 对象来绘制图例 underover 图而不是 on对吗?如果不是,可能没有简单的方法可以做我想做的事。

【问题讨论】:

  • 请参阅this 帖子了解如何移动 matplotlib 图例。
  • 谢谢,但是当我使用 xarray 自动布局来绘制我的图形时,它并不是那么简单。如何访问包含 matplotlib 图例的斧头?当然,我可以使用 subplot 并通过指定轴手动绘制所有子图,但这不是我在这里想要做的。我真的希望有一个不涉及从零开始构建数字的解决方案。
  • 也许你可以使用seaborn的sns.move_legend()?见Legend handle to an xarray plot
  • 感谢您的反馈。抱歉回来晚了,我花了一段时间才能够回到这个项目。可悲的是,它不适用于 FacetGrid 对象。 fig.gca() 没有关联的图例。我想我将不得不挖掘一下才能弄清楚这个数字的确切位置。我尝试了我的 fig.figlegend() 技巧,但它没有发送 seaborn 能够处理的对象。

标签: python matplotlib seaborn python-xarray


【解决方案1】:

我没有你的数据,但这应该工作:

p = dataArray.plot.line(
    y="z",
    hue="source",
    col="t",
    col_wrap=4,
add_legend=False
)
p.add_legend(bbox_to_anchor=(0.5, -.05),
          ncol=5)

你不会自动创建图例,所以你把 add_legend=False 在召唤 plot.line() 但是然后你添加它并传递你的选项。你需要玩 bbox_to_anchor 位置,并与 ncol。我放 5 是因为在您给出的示例中,您有 5 行。

水平选项可用于 pcolormesh 因为那是彩条,而不是图例。事实上,即使在xarray 之外,您也没有用于图例的horizontal 选项,如果我没记错的话,您只有一个颜色条。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多