首页 > 解决方案 > 如何在单个条形图中做两个类别(子图)

问题描述

我需要有关条形图代码的帮助。我的第一个问题是尝试在活动井和非活动井之间进行代码排序。我的第二个问题是在同一个条形图上创建两个子类别(活动和非活动)。这是我到目前为止所写的。任何帮助都会很棒。

代码数据

df = pd.read_csv('Data.CSV')
Active= df['Wells Status']
Inactive= df['Wells Status']
  

fig, ax = plt.subplots()
rects1 = ax.bar(x - width/2, Active, width, label='Active')
rects2 = ax.bar(x + width/2, Inactive, width, label='Inactive')


plt.xlabel('County', fontsize = 20)
plt.ylabel('Total of Wells', fontsize = 20)
plt.title('Wells by County',fontsize=30)
     
    plt.show()

标签: pythonpandasmatplotlibbar-chart

解决方案


我认为,如果我的理解正确,您正在尝试计算给定县的活动井和非活动井的数量。

首先,您正在调用的列中有一个错字。在您的数据中,该列是 'Well Status'而不是'Wells Status'.

接下来,您将需要根据 ACTIVE/INACTIVE 状态对数据进行排序,而不是仅使用df['Well Status']. 为此,您可以使用以下代码行。

Active = df[df['Well Status'].str.match('ACTIVE')]
Inactive = df[df['Well Status'].str.match('INACTIVE')]

这将返回整个 DataFrame,但仅返回列'Well Status'分别等于活动/非活动的行。

要回答您的第二个问题,我们将需要采用我们的两个 Active 和 Inactive 并按县排序。对于您提供的数据,只有一个县,因此您可以使用以下数据。

terry_active = Active[Active['County'].str.match('TERRY (TX)')]
terry_inactive = Inactive[Inactive['County'].str.match('TERRY (TX)')]

如果有更多县,那么您可以使用相同的方法,但只需更改变量名称,然后更改您排序的县/教区。现在这当然是硬编码的,所以对于 3 个以上的县,我会设置一个函数或一个 for 循环来对每个县进行排序,因为根据我的经验,硬编码实际上只对快速项目有益。我通常会尝试编写更通用的可重用代码,但很快就会有一些硬编码工作,并且通常会帮助我编写更通用的代码。

然后绘制你可以使用下面的代码。

counties = ['Terry (TX)']
x = np.arange(len(counties))
fig, ax = plt.subplots()
ax.bar(x - 0.5/2, len(terry_active), label='Active', width=0.5)
ax.bar(x + 0.5/2, len(terry_inactive), label='Inactive', width=0.5)
ax.set_xticks(x)
ax.set_xticklabels(counties)
ax.set_xlabel('County')
ax.set_ylabel('# of Wells')
ax.set_title('Wells by County')

plt.legend()
plt.show()

这又是硬编码的。要做到以上提供的数据中的一个县,您需要将其他县添加到县列表中,然后重复上述步骤进行排序,找出总井数。然后只需添加更多ax.bar()代码行,以便制作每个条。


推荐阅读