Python 在matplotlib pyplot中,如何按类别对条形图中的条形图进行分组?

Python 在matplotlib pyplot中,如何按类别对条形图中的条形图进行分组?,python,matplotlib,plot,categorical-data,Python,Matplotlib,Plot,Categorical Data,首先,我不想做一个常规的分组条形图 我有两个数组,例如 user_score = [70, 95, 86, 50, 17] user_type = ['High', 'High', 'High', 'Mid', 'Low'] 我试图创建一个条形图,这样在本例中,同一类别用户类型的条形图通过分隔或颜色分组在一起 我试图实现的示例图像 图1 如何在pyplot中执行此操作 目前,对于我的实际用例,我只能实现以下目标: 图2 编辑: 一, 实际数据: user_utilisation_ratin

首先,我不想做一个常规的分组条形图

我有两个数组,例如

user_score = [70, 95, 86, 50, 17]
user_type = ['High', 'High', 'High', 'Mid', 'Low']
我试图创建一个条形图,这样在本例中,同一类别用户类型的条形图通过分隔或颜色分组在一起

我试图实现的示例图像

图1

如何在pyplot中执行此操作

目前,对于我的实际用例,我只能实现以下目标:

图2

编辑:

一,

实际数据:

user_utilisation_rating = [0.0, 0.0, 0.0, 0.06, 0.09, 0.12, 0.13, 0.13, 0.14, 0.14, 0.16, 0.26, 0.3, 0.53, 0.54, 0.56, 0.76, 0.79, 1.0, 1.0]
user_type = ['Minimum', 'Minimum', 'Minimum', 'Consistent low', 'Consistent low', 'Consistent low', 'Consistent low', 'Consistent low', 'Consistent low', 'Consistent low', 'Consistent low', 'Ending low', 'Ending low', 'Start low', 'Start low', 'Start low', 'Consistent high', 'Consistent high', 'Maximum', 'Maximum']
二,

改变了图1的风格,使其更接近于我在图2中的实际情节

三,

尝试使用此功能完成此操作,但每个用户类型仅显示1个栏。不知道我做错了什么

import pandas as pd

user_pd = pd.DataFrame({
    'utilisation' : users_utilisation_rating,
    'type' : user_type
})

user_pd.sort_values(by=['utilisation'], inplace=True)

fig, ax = plt.subplots(figsize = (14, 10))

for tp in user_pd['type'].unique():
    ax.bar(user_pd[user_pd['type'] == tp]['type'],
           user_pd[user_pd['type'] == tp]['utilisation'],
           label = tp)

ax.legend()
plt.show()

您可以循环“圆柱体”列中的唯一元素,如下所示:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('mpg.csv')
df.sort_values(by = ['cylinders', 'mpg'], inplace = True)

fig, ax = plt.subplots(figsize = (14, 10))

for cyl in df['cylinders'].unique():
    ax.bar(df[df['cylinders'] == cyl]['name'],
           df[df['cylinders'] == cyl]['mpg'],
           label = cyl)
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)
ax.legend()

plt.show()
color_map = {"Start low": "#581845",
            "Consistent low": "#900C3F",
            "Ending low":"#C70039",
            "Minimum":"#FF5733",
            "Consistent high":"#FFC300",
            "Maximum":"#509916"}


df = pd.DataFrame({"user_rating": user_utilisation_rating,
                  "user_type": user_type})
df.plot.bar(x='user_type', y='user_rating', rot=45,
          color=[color_map[i] for i in user_type])
plt.legend().remove()
plt.show()
得到这个图:

或者,您可以使用seaborn.barplot:

得到这个图:

最后,如果要稍微改善条形图的可视化效果,可以使用透明度值:

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

df = pd.read_csv('mpg.csv')
df.sort_values(by = ['cylinders', 'mpg'], inplace = True)

fig, ax = plt.subplots(figsize = (14, 10))

sns.barplot(x = df['name'],
            y = df['mpg'],
            hue = df['cylinders'],
            edgecolor = 'k',
            dodge = False,
            alpha = 0.3)
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)

plt.show()
其中:


根据您的数据,您可以这样做:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_csv('mpg.csv')
df.sort_values(by = ['cylinders', 'mpg'], inplace = True)

fig, ax = plt.subplots(figsize = (14, 10))

for cyl in df['cylinders'].unique():
    ax.bar(df[df['cylinders'] == cyl]['name'],
           df[df['cylinders'] == cyl]['mpg'],
           label = cyl)
plt.setp(ax.xaxis.get_majorticklabels(), rotation = 90)
ax.legend()

plt.show()
color_map = {"Start low": "#581845",
            "Consistent low": "#900C3F",
            "Ending low":"#C70039",
            "Minimum":"#FF5733",
            "Consistent high":"#FFC300",
            "Maximum":"#509916"}


df = pd.DataFrame({"user_rating": user_utilisation_rating,
                  "user_type": user_type})
df.plot.bar(x='user_type', y='user_rating', rot=45,
          color=[color_map[i] for i in user_type])
plt.legend().remove()
plt.show()
产生了这样的结果:


注意:注意,我已经删除了图例,因为x轴起作用

因此,用户评分是y轴,用户类型是颜色,你的x轴是什么?你能给这个问题添加相关的源数据吗?@Anwarvic x轴不重要-这些条只需要按颜色或x轴上的间距分类。@Roy2012添加了我正在使用的实际数据。我正在模拟认知无线电网络中用户的信任值。@arcanaxion,我添加了一个对您的数据有效的答案。谢谢您的回答。如果我想要它,就像我在编辑的帖子中使用源数据一样,@JohanC当然dodge参数有助于提高可视化效果,谢谢你的建议,我更新了我的答案我很抱歉,我认为我发布的最初示例条形图有误导性。我只有2个阵列,用户利用率和用户类型。我想按颜色对具有相同用户类型的条进行分组,并在图例中显示。谢谢!这对我来说非常适合。很高兴我能帮上忙: