在 matplotlib ax.twiny() 图中格式化 legend-title

Format the legend-title in a matplotlib ax.twiny() plot

信不信由你我需要帮助来格式化简单情节中的图例标题(不是情节标题)。我正在 twiny() 图中针对 Y 绘制两个系列的数据(X1 和 X2)。

我调用matplotlib.lines为图例构造线,然后调用plt.legend构造图例将文本字符串传递给 name/explain 行,格式化该文本并放置图例。我也可以将 title-string 传递给 plt.legend 但我无法格式化它。

我最接近的解决方案是使用 .legend()set_title 为标题创建另一个 'artist' 然后格式化标题文本。我把它赋值给一个变量,并在上面提到的plt.legend中调用这个变量。这不会导致错误,也不会产生预期的效果。我无法控制标题的位置。

我已经通读了许多 S-O 帖子和关于 legend-related 问题的答案,查看了 MPL 文档,各种教程类型 web-pages 甚至达到了 [= =40=] 问题 (#10391)。大概我的问题的答案就在那里,但不是我能够成功实施的格式。

#Imports
import matplotlib.pyplot as plt
import matplotlib.lines as mlines
import numpy as np
import seaborn as sns
plt.style.use('seaborn')

#Some made up data 
y = np.arange(0, 1200, 100)
x1 = (np.log(y+1))
x2 = (2.2*x1)

#Plot figure
fig = plt.figure(figsize = (12, 14))
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax2 = ax1.twiny()

sy1, sy2 = 'b-', 'r-'

tp, bm = 0, 1100

red_ticks = np.arange(0, 11, 2)
ax1.plot(x1, y, sy1)
ax1.set_ylim(tp, bm)
ax1.set_xlim(0, 10)
ax1.set_ylabel('Distance (m)')
ax1.set_xlabel('Area')
ax1.set_xticks(red_ticks)

blue_ticks = np.arange(0, 22, 4)
ax2.plot(x2, y, sy2)
ax2.set_xlim(0, 20)
ax2.set_xlabel('Volume')
ax2.set_xticks(blue_ticks)
ax2.grid(False)

x1_line = mlines.Line2D([], [], color='blue')
x2_line = mlines.Line2D([], [], color='red')

leg = ax1.legend().set_title('Format Legend Title ?',
            prop = {'size': 'large', 
                    'family':'serif',
                    'style':'italic'})

plt.legend([x1_line, x2_line], ['Blue Model', 'Red Model'],
           title = leg,
           prop ={'size':12,
                'family':'serif',
                'style':'italic'},
            bbox_to_anchor = (.32, .92))

所以我想要的是一种简单的方法来控制单个艺术家中 legend-title 和 legend-text 的格式,并且还可以控制所述图例的位置。

上面的代码returns一个"No handles with labels found to put in legend."

您需要一个图例。您可以设置该图例(不是其他图例)的标题;然后根据自己的喜好设计样式。

leg = ax2.legend([x1_line, x2_line], ['Blue Model', 'Red Model'],
                 prop ={'size':12, 'family':'serif', 'style':'italic'},
                 bbox_to_anchor = (.32, .92))
leg.set_title('Format Legend Title ?', prop = {'size': 24, 'family':'sans-serif'})

不相关,但也很重要:请注意,您的代码中有两个数字。您应该删除其中之一。