matplotlib 情节之外的两个图例

2024-02-14

我面临着在情节之外显示两个图例的问题。 显示多个图例inside绘图很简单 - matplotlib 文档中通过示例对其进行了描述。 即使在情节之外显示一个图例也相当容易,正如我在 stackoverflow 上发现的那样(例如here https://stackoverflow.com/questions/10101700/moving-matplotlib-legend-outside-of-the-axis-makes-it-cutoff-by-the-figure-box)。 但我找不到工作示例来显示情节之外的两个图例。 在这种情况下,适用于一个图例的方法不起作用。

这是一个例子。 首先是基本代码:

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.lines import Line2D
from matplotlib.font_manager import FontProperties

fig1 = plt.figure(figsize=(17,5))
fontP = FontProperties()
fontP.set_size('small')
ax1 = fig1.add_subplot(111, aspect='equal')
ax1.grid()


# stuff for legend
rec1 = patches.Rectangle(
    (0.9, 0.25),   # (x,y)
    0.1,          # width
    0.1,          # height
    label='rectangle',
    **{
        'color': 'blue'
    }

)
ax1.add_patch(rec1)

leg = plt.legend(handles=[rec1], bbox_to_anchor=(0.7, -0.1))
fig1.savefig('sample1.png', dpi=90, bbox_inches='tight')

但现在我想在情节的右侧绘制另一个图例。 这是代码:

...
ax1.add_patch(rec1)

l1 = plt.legend(prop=fontP, handles=[rec1], loc='center left',
                box to_anchor=(1.0, 0.5))
plt.gca().add_artist(l1)

...

结果:

如您所见,第二个图例被截断。 我的结论是 matplotlib 忽略添加的对象的大小和位置

plt.gca().add_artist(obj)

我怎样才能解决这个问题?

到目前为止,我找到了一个解决方案,但它非常令人讨厌:

创建三个图例,其中两个作为附加图例(由 add_artist 添加),一个作为普通图例。 至于 matplotlib 尊重正常图例的位置和大小,将其移动到右下角并hide它与代码:

leg.get_frame().set_alpha(0)

以下是结果(未设置 alpha 作为示例):

它的行为正是我想要的,但正如你所知,它很讨厌。 这是最终的代码:

import matplotlib.pyplot as plt
import matplotlib.patches as patches
from matplotlib.lines import Line2D
from matplotlib.font_manager import FontProperties

fig1 = plt.figure(figsize=(17,5))
fontP = FontProperties()
fontP.set_size('small')
ax1 = fig1.add_subplot(111, aspect='equal')
ax1.grid()

# stuff for additional legends
rec1 = patches.Rectangle(
    (0.9, 0.25),   # (x,y)
    0.1,          # width
    0.1,          # height
    label='rectangle',
    **{
        'color': 'blue'
    }
)
ax1.add_patch(rec1)

# example additional legends
l1 = plt.legend(prop=fontP, handles=[rec1], loc='center left',
bbox_to_anchor=(1.0, 0.5))
l2 = plt.legend(prop=fontP, handles=[rec1], loc=3, bbox_to_anchor=(0.4,
-0.2))

# add legends
plt.gca().add_artist(l1)
plt.gca().add_artist(l2)

# add third legend
leg = plt.legend(handles=[], bbox_to_anchor=(1.3, -0.3))
leg.get_frame().set_alpha(0) # hide legend

fig1.savefig('sample3.png', dpi=90, bbox_inches='tight')

我可以建议以下解决方案:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec

fig = plt.figure()
fig.set_size_inches((10,10))

gs1 = gridspec.GridSpec(1, 1)
ax1 = fig.add_subplot(gs1[0])

x = np.arange(0.0, 3.0, 0.02)
y1 = np.sin(2*np.pi*x)
y2 = np.exp(-x)
l1, l2 = ax1.plot(x, y1, 'rs-', x, y2, 'go')

y3 = np.sin(4*np.pi*x)
y4 = np.exp(-2*x)
l3, l4 = ax1.plot(x, y3, 'yd-', x, y4, 'k^')

fig.legend((l1, l2), ('Line 1', 'Line 2'), "right")
fig.legend((l3, l4), ('Line 3', 'Line 4'), "lower center")

gs1.tight_layout(fig, rect=[0, 0.1, 0.8, 0.5])

我使用了 matplotlib 网站上的示例,并遵循有关紧密布局的文档http://matplotlib.org/users/tight_layout_guide.html http://matplotlib.org/users/tight_layout_guide.html.

The result is

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matplotlib 情节之外的两个图例 的相关文章

随机推荐

  • 颜色必须是 aRGB 十六进制值?

    所以我之前为污染数据集运行了一些代码 并且代码运行得很好 现在 我收到此错误 颜色必须是 aRGB 十六进制值 我唯一的代码行如下 pollution jawn pd read excel ObservationData irkfioc c
  • C++ 中的友元函数可以有一个类型具有私有析构函数的默认参数吗?

    在下一个示例中 类U带有私有析构函数有一个友元函数foo 这个友元函数有类型参数U带默认值U class U U friend void foo U void foo U Clang 和 MSVC 接受此代码 但 GCC 拒绝它并出现错误
  • “提交”和“修订”有什么区别

    提交和修订有什么区别 我们使用 SVN 并从 Atlassian Fisheye 获取指标 Fisheye 中有一份报告显示了 顶级提交者 按修订 和 顶级提交者 按提交 这里没有人能告诉我有什么区别 非常感谢 安迪 一次提交可以包含许多文
  • 微调超参数不会提高分类器的分数

    我遇到一个问题 即使用 GridSearchCV 微调超参数并不能真正改善我的分类器 我认为改进应该比这更大 我使用当前代码获得的分类器的最大改进约为 0 03 我有一个包含八列和不平衡二进制结果的数据集 对于评分 我使用 f1 并使用 K
  • 为什么我的 Snort 日志为空?

    我运行的是 macOS Sierra 10 12 3 sw vers ProductName Mac OS X ProductVersion 10 12 3 BuildVersion 16D32 我已经使用安装了snorthomebrew
  • 什么是“ld-2.11.1.so”以及如何查看源代码?

    我正在尝试对计算机上 RDTSC 指令的使用进行分类 我的第一个想法是运行我的 lib文件夹通过objdump并搜索 RDTSC for f in ls lib do echo f objdump d f grep n rdtsc done
  • 在oracle中使用触发器更改日期时出现问题

    我想创建一个触发器 可以修改或插入我的表 合同 中的日期 如果拥有当前合同的客户签署新合同 结束日期 前一个活动将是新活动开始日期的前一天 So my trigger is CREATE OR REPLACE TRIGGER TRIGGER
  • 如何检查 iOS 或 macOS 上的活动互联网连接?

    我想使用以下命令检查我在 iOS 上是否有互联网连接可可触感 https en wikipedia org wiki Cocoa Touch库或在 macOS 上使用Cocoa https en wikipedia org wiki Coc
  • 如何生成两个数字之间的随机值[重复]

    这个问题在这里已经有答案了 可能的重复 Java 生成一定范围内的随机数 https stackoverflow com questions 363681 java generating random number in a range 如
  • 有没有一种方法可以在没有基于登录的身份验证的情况下保护 API 的安全?

    我目前正在为一个网站开发一个 API 但该网站不需要登录即可使用 因此该 API 必须在没有个人用户身份验证的情况下工作 目标是防止 API 被第三方使用 有没有办法保护API仅由我的网站使用 而不使用登录身份验证来防止第三方调用后端服务
  • 如何在 Android 上以编程方式安装 CA 证书而无需用户交互

    我正在尝试安装证书而不提示用户 我知道这不是一个好的做法 但这就是总理想要的 Using KeyChain createInstallIntent http developer android com reference android s
  • 发现多个文件具有与操作系统无关的路径“org/apache/http/client/version.properties”

    在将 Android studio 从 2 3 更新到 3 0 之前 一切正常 我在Android Studio中运行应用程序时遇到此错误 编译通过 我不明白为什么会出现这个错误 我在互联网上什么也没找到 这是我的 gradle 文件 pa
  • Spark DataFrame 中的 queryExecution 有什么用?

    我必须了解数据帧对象上名为 queryExecution 的变量 并在 console 中找到以下输出 但不确定它有什么帮助 请在控制台中找到输出 scala gt df queryExecution res5 org apache spa
  • 正则表达式在vim中插入空格

    我是一个正则表达式超级菜鸟 刚刚阅读了我的第一篇关于它们的文章 同时致力于更好地使用 vim 我想使用正则表达式来搜索冒号的所有实例 后面没有空格并且insert一个空间between这些冒号及其后面的任何字符 如果我从以下开始 foo b
  • 如何在vue loader组件中导入JS脚本?

    我有一个 vue 组件 vue 组件 vue loader
  • 将带有辅助 y 轴的 pandas 条形图图例放在条形前面

    我有一个带有辅助 y 轴的 pandas DataFrame 我需要一个条形图 条形图前面有图例 目前 图例前面有一组酒吧 如果可以的话 我还想把图例放在左下角 任何想法表示赞赏 我尝试设置 legend false 并添加自定义图例 但它
  • AVD 模拟器被杀 - Mac

    我花了一整天的时间尝试了在 stackoverflow 上的多个问题和数十个谷歌结果中找到的所有方法 简短摘要 重新启动电脑 删除并重新创建 AVD 将 AVD 图形更改为软件 在 AVD 管理器中和直接在文件中 在 SDK 管理器中重新安
  • 具有动态数据类型的 C 模块化数据结构

    对于我即将进行的大学 C 项目 我被要求拥有 C 允许的模块化代码 基本上 我将拥有一些数据结构的 c 文件和相应的 h 文件 例如链表 二叉树 哈希表等 以链表为例 我有这样的 typedef struct sLinkedList int
  • 如何获取点击的listviewitem的上一项

    我有两项活动 在 Activity1 中 我有从数据库填充的列表视图 单击项目后 它应该转到 Activity2 Activity2 包含两个按钮 下一个和上一个 并显示产品详细信息 我试图获取单击的列表视图项目的上一个项目并在按钮中设置文
  • matplotlib 情节之外的两个图例

    我面临着在情节之外显示两个图例的问题 显示多个图例inside绘图很简单 matplotlib 文档中通过示例对其进行了描述 即使在情节之外显示一个图例也相当容易 正如我在 stackoverflow 上发现的那样 例如here https