首页 > 解决方案 > Matplotlib 水平条图(barh):为什么条在顶部而不是彼此相邻?

问题描述

我试图复制这个例子,除了作为水平条形图。

我写了这段代码:

import sys
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import StrMethodFormatter
import numpy as np

Fams = ['Item1','Item2','Item3','Item4','Item5','Item6','Item7','Item8','Item9','Item10','Item11','Item12','Item13','Item14','Item15','Item16','Item17','Item18','Item19','Item20','Item21']
AllTested = [3,3,3,3,4,4,4,4,4,4,4,5,5,6,6,7,9,9,10,10,27]
BestSubsetTested = [1,0,0,0,3,0,3,0,1,0,1,1,2,4,1,1,8,4,9,8,11]

plt.figure(figsize=[60,40])
X = np.arange(len(Fams))
plt.barh(X,AllTested,color='g')
plt.barh(X + 0.25,BestSubsetTested,color='b')
plt.yticks([i+0.25 for i in range(len(Fams))],Fams)

# Naming the x and y axis
plt.xlabel('Tests')
plt.ylabel('Fams')

plt.savefig('day2.png',format='png')

当我不添加任何宽度参数时,脚本会运行,但在输出中,条形不会彼此相邻:

由于我希望条形图彼此相邻(即 Fam 项目有两个条形图配对在一起 - AllTested 和 BestSubsetTested - ,每个 Fam 项目之间的间隙稍大一些,以便清楚地说明这一点,类似于示例),我添加了“宽度”参数如示例中所示,但出现错误:

我收到一条错误消息:

Traceback (most recent call last):
  File "make_plot_species_multiple2.py", line 13, in <module>
    plt.barh(X,AllTested,color='g',width=0.25)

谁能帮我?

最终的输出应该和我做的类似,除了

标签: pythonmatplotlib

解决方案


对于barh,条的宽度由height参数控制,而不是width。在这里,我将height两个调用都设置为 0.4 barh,并将它们偏移 +/- 0.25。如果像我在这里一样上下偏移条形,则不需要偏移 yticks。

要旋转刻度标签,您可以添加rotation=45yticks函数中。

为了使刻度标签更大,我只是将图形大小从 (60, 40) 减小到 (12, 8)。另一种方法是更改​​所有刻度标签和轴标签的字体大小。

import sys
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import StrMethodFormatter
import numpy as np
plt.rcdefaults()

Fams = ['Item1','Item2','Item3','Item4','Item5','Item6','Item7','Item8','Item9','Item10','Item11','Item12','Item13','Item14','Item15','Item16','Item17','Item18','Item19','Item20','Item21']
AllTested = [3,3,3,3,4,4,4,4,4,4,4,5,5,6,6,7,9,9,10,10,27]
BestSubsetTested = [1,0,0,0,3,0,3,0,1,0,1,1,2,4,1,1,8,4,9,8,11]

plt.figure(figsize=[12, 8])
X = np.arange(len(Fams))
plt.barh(X-0.25, AllTested,color='g', height=0.4)
plt.barh(X+0.25, BestSubsetTested,color='b', height=0.4)
plt.yticks([i for i in range(len(Fams))],Fams, rotation=45)

# Naming the x and y axis
plt.xlabel('Tests')
plt.ylabel('Fams')

plt.savefig('day2.png',format='png')

在此处输入图像描述


推荐阅读