python 针对多个类别的变量如何画图 分类组合柱状图

请教python 针对多个类别的变量如何画图,下图是我想要的结果,最下方的图是我目前的样子,如何修改代码?

img

img

df_ct3=df2.groupby(["Station","GEN3_date","Location Result"])['Identifier'].count().unstack().fillna(0)
df_ct3["ratio"]=df_ct3["Bad"]/(df_ct3["Bad"]+df_ct3["Good"])
df_ct3copy=df_ct3.reset_index()
plt.figure(figsize=(12,6))
sns.barplot(x="GEN3_date",y="ratio",hue="Station", data=df_ct3copy)

img

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/692773
  • 你也可以参考下这篇文章:Python编程语言学习:python语言中快速查询python自带模块&函数的用法及其属性方法、如何查询某个函数&关键词的用法、输出一个类或者实例化对象的所有属性和方法名之详细攻略
  • 同时,你还可以查看手册:python- 序列和其他类型的比较 中的内容
  • 除此之外, 这篇博客: Python实现音乐推荐系统【跟着迪哥学python】中的 取其中一部分数(按大小排好序的了,这些应该是比较重要的数据),作为我们的实验数据 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • #10W名用户的播放量占总体的比例
    total_play_count = sum(song_count_df.play_count)
    print ((float(play_count_df.head(n=100000).play_count.sum())/total_play_count)*100)
    play_count_subset = play_count_df.head(n=100000)
    
    40.8807280500655
    
    (float(song_count_df.head(n=30000).play_count.sum())/total_play_count)*100
    
    78.39315366645269
    
    song_count_subset = song_count_df.head(n=30000)
    

    前3W首歌的播放量占到了总体的78.39%
    现在已经有了这10W名忠实用户和3W首经典歌曲,接下来我们就要对原始数据集进行过滤清洗,说白了就是在原始数据集中剔除掉不包含这些用户以及歌曲的数据。

    取10W个用户,3W首歌

    user_subset = list(play_count_subset.user)
    song_subset = list(song_count_subset.song)
    

    过滤掉其他用户数据

    #读取原始数据集
    triplet_dataset = pd.read_csv(filepath_or_buffer=data_home+'train_triplets.txt',sep='\t', 
                                  header=None, names=['user','song','play_count'])
    #只保留有这10W名用户的数据,其余过滤掉
    triplet_dataset_sub = triplet_dataset[triplet_dataset.user.isin(user_subset) ]
    del(triplet_dataset)
    #只保留有这3W首歌曲的数据,其余也过滤掉
    triplet_dataset_sub_song = triplet_dataset_sub[triplet_dataset_sub.song.isin(song_subset)]
    del(triplet_dataset_sub)
    
    triplet_dataset_sub_song.to_csv(path_or_buf=data_home+'triplet_dataset_sub_song.csv', index=False)
    

    当前我们的数据量

    triplet_dataset_sub_song.shape
    
    (10774558, 3)
    

    数据样本个数此时只有原来的1/4不到,但是我们过滤掉的样本都是稀疏数据不利于建模,所以当拿到了数据之后对数据进行清洗和预处理工作还是非常有必要的,不单单提升计算的速度,还会影响最终的结果。

    triplet_dataset_sub_song.head(n=10)
    
    usersongplay_count
    498d6589314c0a9bcbca4fee0c93b14bc402363afeaSOADQPP12A67020C8212
    499d6589314c0a9bcbca4fee0c93b14bc402363afeaSOAFTRR12AF72A8D4D1
    500d6589314c0a9bcbca4fee0c93b14bc402363afeaSOANQFY12AB01832391
    501d6589314c0a9bcbca4fee0c93b14bc402363afeaSOAYATB12A6701FD501
    502d6589314c0a9bcbca4fee0c93b14bc402363afeaSOBOAFP12A8C131F367
    503d6589314c0a9bcbca4fee0c93b14bc402363afeaSOBONKR12A58A7A7E026
    504d6589314c0a9bcbca4fee0c93b14bc402363afeaSOBZZDU12A6310D8A37
    505d6589314c0a9bcbca4fee0c93b14bc402363afeaSOCAHRT12A8C13A1A45
    506d6589314c0a9bcbca4fee0c93b14bc402363afeaSODASIJ12A6D4F5D891
    507d6589314c0a9bcbca4fee0c93b14bc402363afeaSODEAWL12AB01870328
  • 您还可以看一下 CSDN就业班老师的Python爬虫技术和浏览器模拟,验证码识别视频教程课程中的 验证码信息识别小节, 巩固相关知识点

根据你提供的代码理解分析,如下:
#可以使用Pandas和Seaborn库来绘制图形。
#你已经对数据进行了一些处理,并创建了一个名为df_ct3的DataFrame,其中包含了Station、GEN3_date和Location Result的分组信息,以及Identifier的计数。同时还创建了一个名为"ratio"的新列,其中包含了不良品率(Bad/(Bad+Good))。最后,你使用reset_index()函数将DataFrame重置为适合绘图的格式。

#接下来,你可以使用Seaborn库中的barplot()函数来绘制柱状图。该函数需要指定x轴和y轴变量,以及可选的颜色变量(hue)。以下是给你提供的思路参考,可以尝试的一些修改和扩展:

#添加x轴和y轴标签:
plt.xlabel('GEN3_date')  
plt.ylabel('Ratio')

#添加标题:
plt.title('Ratio by GEN3_date and Station')

#调整图形大小:
plt.figure(figsize=(12, 8))

#使用hue参数将不同站点的数据着上不同的颜色:
sns.barplot(x="GEN3_date", y="ratio", hue="Station", data=df_ct3copy)

#按日期和站点分组并绘制堆积柱状图,则可以使用groupby()函数和pivot_table()函数
df_pivot = df_ct3copy.pivot_table(index='GEN3_date', columns='Station', values='ratio', aggfunc='mean')  
sns.barplot(x="Station", y="ratio", data=df_pivot)

#在同一图中绘制不同站点的比例,可以使用会话(Session)参数来调整颜色映射:
session = sns.catplot(x="GEN3_date", y="ratio", hue="Station", kind="bar", data=df_ct3copy, ci=None)  
session.set(ci=None)
#如有帮助,恭请采纳

问题点: 多维度分析和图形绘制到一张图上.
分析思路: 按照多维度分组计算和多组数据绘图,绘制在一个画布上.

参考代码:多个文件分列展示在同一画布

import plotly.offline as py
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
import os

files = ''
root = ''
for root, dir, files in os.walk('csv_file'):
    print('all file name:', files)

df_list = []
column_list = []
for file in files:
    file_name = root + '/' + file
    df = pd.read_csv(file_name)
    df_list.append(df)
    # 动态获取列数
    column_num = len(df.columns.values)
    column_list.append(column_num)

# 获取列数最大的一个值,作为创建子图的行数
max_num = max(column_list)

# 创建子图,列数为文件数
fig = make_subplots(rows=max_num - 1, cols=len(files))
for i in range(len(df_list)):
    df = df_list[i]
    column_head_list = df.columns.values
    for j in range(1, len(column_head_list)):
        column_head = column_head_list[j]
        trance = go.Scatter(x=df['日期'], y=df[column_head], mode="lines", name=column_head)
        # 规划列,将对应文件,放在对应列
        fig.append_trace(trance, j, i + 1)
    fig.update_layout(width=1300, height=((len(column_head_list) - 1)) * 600)

py.plot(fig)


python使用matplotlib可视化多个分组并排的柱状图(bar plot side by side)
可以参考下,非常详细
https://blog.csdn.net/BlackYIYI/article/details/127997879
https://blog.csdn.net/zhongkeyuanchongqing/article/details/123027044

可以使用 seaborn 库来绘制

你说的是这种图吧:

img


这里,给你一个大概的例子:

import matplotlib.pyplot as plt
import numpy as np

data = {
    'category1': [10, 15, 20, 25, 30],
    'category2': [15, 20, 25, 30, 35],
    'category3': [20, 25, 30, 35, 40]
}
fig, ax = plt.subplots()
ax.set_title('Classification Combination Bar Chart')
ax.set_xlabel('Categories')
ax.set_ylabel('Counts')
keys = data.keys()
values = np.array(list(data.values()))
index = np.arange(len(keys))
width = 0.25
ax.barh(index, values[:, 0], width, color='b')
ax.barh(index + width, values[:, 1], width, color='g')
ax.barh(index + width * 2, values[:, 2], width, color='r')
ax.set_xlim(0, max(values[:, 0] + values[:, 1] + values[:, 2]))
ax.set_xticks(np.arange(len(keys)) + width * 2)
ax.set_xticklabels(keys)
ax.legend(['category1', 'category2', 'category3'], loc='upper right')
plt.show()

最终的效果是这样的:

img

或者可以参考:
关于Python绘制柱状图等图形:https://zhuanlan.zhihu.com/p/441205244
Python 绘画excel分组柱状图:https://blog.csdn.net/weixin_42210634/article/details/125867171

和案例代码对比一下,看看差别在哪里,参照这修改

使用matplotlib和seaborn库
使用matplotlib库:

import matplotlib.pyplot as plt

# 定义类别和变量
categories = ['Category 1', 'Category 2', 'Category 3']
var1 = [10, 15, 8]
var2 = [12, 9, 6]
var3 = [8, 6, 10]

# 设置图形大小
plt.figure(figsize=(8, 6))

# 绘制柱状图
plt.bar(categories, var1, label='Variable 1')
plt.bar(categories, var2, bottom=var1, label='Variable 2')
plt.bar(categories, var3, bottom=[i+j for i,j in zip(var1,var2)], label='Variable 3')

# 添加图例和标签
plt.legend()
plt.xlabel('Categories')
plt.ylabel('Values')
plt.title('Multiple Categories Bar Chart')

# 显示图形
plt.show()

使用seaborn库:

import seaborn as sns
import pandas as pd

# 定义类别和变量
categories = ['Category 1', 'Category 2', 'Category 3']
var1 = [10, 15, 8]
var2 = [12, 9, 6]
var3 = [8, 6, 10]

# 创建数据框
df = pd.DataFrame({'Category': categories, 'Variable 1': var1, 'Variable 2': var2, 'Variable 3': var3})

# 使用seaborn绘制柱状图
sns.barplot(x='Category', y='Variable 1', data=df, label='Variable 1')
sns.barplot(x='Category', y='Variable 2', data=df, bottom=df['Variable 1'], label='Variable 2')
sns.barplot(x='Category', y='Variable 3', data=df, bottom=df['Variable 1']+df['Variable 2'], label='Variable 3')

# 添加图例和标签
plt.legend()
plt.xlabel('Categories')
plt.ylabel('Values')
plt.title('Multiple Categories Bar Chart')

# 显示图形
plt.show()

以下答案参考newbing,回答由博主波罗歌编写:
根据你的描述,你想要绘制一个分类组合柱状图,其中 x 轴是 "GEN3_date",y 轴是 "ratio"。柱状图按照不同的 "Station" 进行颜色区分。

可以使用 seaborn 库的 barplot 函数来实现这个需求。你已经在代码中使用了 barplot 函数,只需要稍作修改即可。

以下是修改后的代码:

import seaborn as sns
import matplotlib.pyplot as plt

df_ct3 = df2.groupby(["Station", "GEN3_date", "Location Result"])['Identifier'].count().unstack().fillna(0)
df_ct3["ratio"] = df_ct3["Bad"] / (df_ct3["Bad"] + df_ct3["Good"])
df_ct3copy = df_ct3.reset_index()

plt.figure(figsize=(12, 6))
sns.barplot(x="GEN3_date", y="ratio", hue="Station", data=df_ct3copy)

plt.legend(title="Station", title_fontsize='12')
plt.xlabel("GEN3_date", fontsize=12)
plt.ylabel("Ratio", fontsize=12)
plt.title("Classification Combination Bar Chart", fontsize=14)
plt.xticks(rotation=45)

plt.show()

这个修改后的代码添加了一些额外的绘图设置,包括图例标题、坐标轴标题和图表标题,并通过 rotation=45 设置了 x 轴标签的旋转角度,以便更好地显示日期。

希望这可以帮助到你!
如果我的回答解决了您的问题,请采纳!