matplotlib 字幕位置错误,图例不可见

pbossiut  于 2023-06-06  发布在  其他
关注(0)|答案(2)|浏览(181)

我有五个列表,我打算在两个单独的子情节中绘制。在子图1中,我想要列表1、2、3和4;在子图2中,我要列表4和5。这些是用于设置x label的列表和event_index

event_index=['event 1','event 2','event 3','event 4','event 5','event 6','event 7','event 8','event 9','event 10']
list1 = [0.7,0.8,0.8,0.9,0.8,0.7,0.6,0.9,1.0,0.9]
list2 = [0.2,0.3,0.1,0.0,0.2,0.1,0.3,0.1,0.2,0.1]
list3 = [0.4,0.6,0.4,0.5,0.4,0.5,0.6,0.4,0.5,0.4]
list4 = [78,87,77,65,89,98,74,94,85,73]
list5 = [16,44,14,55,34,36,76,54,43,32]

为了生成两个子图,我使用以下代码:

fig = plt.figure() #Creates a new figure
ax1 = fig.add_subplot(211) #First subplot: list 1,2,3, and 4
ax2 = ax1.twinx() #Creates a twin y-axis for plotting the values of list 4
line1 = ax1.plot(list1,'bo-',label='list1') #Plotting list1
line2 = ax1.plot(list2,'go-',label='list2') #Plotting list2
line3 = ax1.plot(list3,'ro-',label='list3') #Plotting list3
line4 = ax2.plot(list4,'yo-',label='list4') #Plotting list4
ax1.set_ylim(0,1)
ax1.set_xlim(1, len(event_index)+1)
ax1.set_ylabel('Some values',fontsize=12)
ax2.set_ylabel('% values',fontsize=12)
ax2.set_ylim(0,100)
ax2.set_xlim(1, len(event_index)+1)
ax3 = fig.add_subplot(212) #Second subplot: list 4 and 5
ax3.set_xlim(1, len(event_index)+1)
ax3.set_ylabel('% values',fontsize=12)
#Plotting Footprint % and Critical Cells %
ax3.plot(list4,'yo-',label='list4')
line5 = ax3.plot(list5,'mo-',label='list5')
#Assigning labels
lines = line1+line2+line3+line4+line5
labels = [l.get_label() for l in lines]
ax3.legend(lines, labels, loc=(0,-0.4), ncol=5) #The legend location. All five series are in the same legend.
ax3.set_xlabel('events')
title_string=('Some trends')
subtitle_string=('Upper panel: list 1, 2, 3, and 4 | Lower panel: list 4 and 5')
plt.suptitle(title_string, y=0.99, fontsize=17)
plt.title(subtitle_string, fontsize=8)
fig.tight_layout()
plt.show()

我得到的是这个:

几个问题:

1.副标题不是在第一个子情节上面而是在第二个子情节上面
1.我无法看到/读取图例,我希望图例居中,但位于子图2的x labels下方
1.我的所有列表都有len=10,但只绘制了9
1.可能,我想在第二个子图中去掉y-axis刻度
1.我希望图表标题一些趋势不要“粘”在第一个子图上
我如何改善我的图表?谢谢!

cl25kdpy

cl25kdpy1#

1.使用ax1.set_title绘制副标题,而不是plt.title(因为这将在最后一个活动的子图上绘制标题)
1.我在你的最后一个问题中向你展示了如何为底部的图例腾出空间。你需要fig.subplots_adjust(bottom=0.3)(你可能需要调整0.3)
1.你只有9个点,因为你通过设置xlim为(1,len(list)+1)来删除第一个点,因为python的索引是从0开始的,而不是1。相反,创建一个列表以绘制x值:

x = range(1,len(list1)+1)
ax1.plot(x, list1)

1.使用ax3.yaxis.set_ticks_position('left')仅在左侧绘制刻度线,在右侧将其关闭
1.你可以移动这个,增加y参数,例如。

plt.suptitle(title_string, y=1.05, fontsize=17)
brjng4g3

brjng4g32#

1.您可以手动设置suptitle的位置,如下所述:http://matplotlib.org/api/figure_api.html#matplotlib.figure.Figure.suptitle就像这样使用它,x和y是你的图的相对坐标(从0到1):

suptitle("Here goes the title", x=0.5, y=0.95)

1.您可以使用设置图例位置,如下所述:https://stackoverflow.com/a/4701285/5528308按照用户Joe Kington的建议尝试此操作

# Shrink current axis's height by 10% on the bottom
box = ax.get_position()
ax.set_position([box.x0, box.y0 + box.height * 0.1,
         box.width, box.height * 0.9])

# Put a legend below current axis
ax.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
      fancybox=True, shadow=True, ncol=5)

1.你的图只显示了9个值,因为x轴从1开始,而Python的迭代从0开始。由于在图中没有给予x值,Python从0到9绘制,但将轴限制在1到10之间。这样做:

x_vals = np.linspace(1,10,10)
line1 = ax1.plot(x_vals, list1,'bo-',label='list1')

并对其它图重复。

  1. grid是什么意思通常网格指的是网格线,你没有。如果您指的是刻度,则可以使用ax2.get_yaxis().set_ticks([])删除它们
    1.尝试使用plt.gcf().tight_layout()。在大多数情况下,这将在所有地方使用适当的空格来安排您的图。

相关问题