在Python中水平对齐柱状图图例

13 浏览
0 Comments

在Python中水平对齐柱状图图例

我用以下代码制作了一个多轴图,但是无法按照我想要的方式排列图例。我的图表代码如下:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(4)
y = [5, 7, 4, 9]
z = [9, 3, 5, 6]
r = [30, 40, 45, 37]
fig,ax = plt.subplots()
abc = ax.bar(x,y,0.25 )
cde = ax.bar(x+0.25,z,0.25)
ax.legend((abc[0], cde[0]), ('y', 'z'),bbox_to_anchor=(0., 1.02, 1, .102) , borderaxespad=0.)
ax.set_xticks(x + 0.25 / 2)
ax.set_xticklabels(('A', 'B', 'C', 'D'))
ax2 = ax.twinx()
efg = ax2.plot(x+0.25/2,r,color = 'black',label = "r")
ax2.legend(bbox_to_anchor=(0.11,1.07) , borderaxespad=0.)
plt.show()

图表如下所示:enter image description here

右上角的图例垂直对齐,但我想要它们水平对齐。我找不到相关的文档。我希望它们如下图所示:

enter image description here

0
0 Comments

问题的出现原因是希望将水平方向上的柱状图图例进行对齐,但默认情况下,图例是垂直排列的。解决方法是使用matplotlib的legend函数的ncol参数来设置图例的列数,以及使用loc参数和bbox_to_anchor参数来调整图例的位置,使两个图例对齐。

具体的解决步骤如下:

1. 使用ncol参数来设置图例的列数,例如ncol=2表示设置为两列。

ax.legend(..., ncol=2)

2. 使用loc参数和bbox_to_anchor参数来调整图例的位置。可以参考这个链接中的解答,找到合适的参数值,使两个图例对齐。

ax.legend((abc[0], cde[0]), ('y', 'z'),loc="lower right", bbox_to_anchor=(1., 1.02) , borderaxespad=0., ncol=2)
ax2.legend(bbox_to_anchor=(0,1.02),loc="lower left", borderaxespad=0.)

3. 最后,根据需要设置其他图形属性,如坐标轴刻度和标签等。

下面是一个示例代码,展示了如何使用上述方法对水平方向上的柱状图图例进行对齐:

import matplotlib.pyplot as plt
import numpy as np
x = np.arange(4)
y = [5, 7, 4, 9]
z = [9, 3, 5, 6]
r = [30, 40, 45, 37]
fig,ax = plt.subplots()
abc = ax.bar(x,y,0.25 )
cde = ax.bar(x+0.25,z,0.25)
ax.legend((abc[0], cde[0]), ('y', 'z'),loc="lower right", bbox_to_anchor=(1., 1.02) , borderaxespad=0., ncol=2)
ax.set_xticks(x + 0.25 / 2)
ax.set_xticklabels(('A', 'B', 'C', 'D'))
ax2 = ax.twinx()
efg = ax2.plot(x+0.25/2,r,color = 'black',label = "r")
ax2.legend(bbox_to_anchor=(0,1.02),loc="lower left", borderaxespad=0.)
plt.show()

以上代码运行后,会生成一个图例中包含两个图例项的柱状图,且两个图例项在水平方向上对齐。

0