gpt4 book ai didi

python - 如何在 Matplotlib 中生成嵌套图例

转载 作者:行者123 更新时间:2023-12-04 04:00:01 24 4
gpt4 key购买 nike

我必须在 Matplotlib 中绘制一个数量,它是各种贡献的总和

我想通过将各种贡献列为主要图例条目的子元素,在图例中强调这一事实。

可以在下图中找到我想要获得的结果的草图。请注意,我不一定要完全实现所描述的图例,而只是类似的东西。

最佳答案

您可以尝试为您的图形创建两个单独的图例。当然,这是一个技巧而不是图例对象的直接特征,因为在 matplotlib 中似乎没有实现你需要的东西。但是使用 bbox 中的数字和字体大小,您可以很好地自定义它。

import matplotlib.pyplot as plt 
import numpy as np

x = np.arange(0.0, 1, 0.01)
x1 = np.sin(2*np.pi*x)
x2 = np.sin(2*np.pi*x+1)
x3 = np.sin(2*np.pi*x+2)


fig, ax = plt.subplots()
f1, = ax.plot(x1, 'r', lw=4)
f2, = ax.plot(x2, 'k', lw=2)
f3, = ax.plot(x3, 'b', lw=2)

legend1 = plt.legend([f1], ["Main legend"], fontsize=12, loc=3, bbox_to_anchor=(0,0.1,0,0), frameon=False)
legend2 = plt.legend((f2, f3), ('sublegend 1', 'sublegend 2'), fontsize=9,
loc=3, bbox_to_anchor=(0.05,0,0,0), frameon=False)
plt.gca().add_artist(legend1)
plt.show()

enter image description here

编辑:

好吧,如果我们插入 2 个图例,为什么不直接插入一个全新的图形作为插图插入更大的图形中,专用于图例,您可以在其中绘制和书写任何您喜欢的东西?诚然这是一项艰巨的工作,你必须设计里面的每一条线,包括精确的位置坐标。但这就是我能想到的做你想做的事情的方式:

import matplotlib.pyplot as plt
import numpy as np

x = np.arange(0.0, 1, 0.01)
x1 = np.sin(2*np.pi*x)
x2 = np.sin(2*np.pi*x+1)
x3 = np.sin(2*np.pi*x+2)


fig, ax = plt.subplots()
f1, = ax.plot(x1, 'r', lw=4)
f2, = ax.plot(x2, 'k', lw=2)
f3, = ax.plot(x3, 'b', lw=2)

## set all lines for inner figure
yline1 = np.array([-0.15, -0.15])
line1 = np.array([2, 10])
yline2 = np.array([3, 0])
line2 = np.array([4, 4])
yline3 = np.array([1.5, 1.5])
line3 = np.array([4, 6])
yline4 = np.array([1.5, 1.5])
line4 = np.array([7, 10])
yline5 = np.array([3, 3])
line5 = np.array([4, 6])
yline6 = np.array([3, 3])
line6 = np.array([7, 10])

## inset figure
axin1 = ax.inset_axes([2.5, -1, 30, 0.5], transform=ax.transData) #

## plot all lines
axin1.plot(line1, yline1, linewidth=4, c='r')
axin1.plot(line2, yline2, 'k', lw=1)
axin1.plot(line3, yline3, 'k', lw=1)
axin1.plot(line4, yline4, 'b', lw=3)
axin1.plot(line5, yline5, 'k', lw=1)
axin1.plot(line6, yline6, 'k', lw=3)

## text
axin1.text(12, 0, 'MAIN', fontsize=12)
axin1.text(12, 1.7, 'Subtext 1', fontsize=10)
axin1.text(12, 3.2, 'Subtext 2', fontsize=10)

## adjust
axin1.set_ylim([4, -1])
axin1.set_xlim([0, 27])
axin1.set_xticklabels('')
axin1.set_yticklabels('')

enter image description here

关于python - 如何在 Matplotlib 中生成嵌套图例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63235757/

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