在 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'})
不相关,但也很重要:请注意,您的代码中有两个数字。您应该删除其中之一。
信不信由你我需要帮助来格式化简单情节中的图例标题(不是情节标题)。我正在 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'})
不相关,但也很重要:请注意,您的代码中有两个数字。您应该删除其中之一。