请教python 针对多个类别的变量如何画图,下图是我想要的结果,最下方的图是我目前的样子,如何修改代码?
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)
#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)
user | song | play_count | |
---|---|---|---|
498 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SOADQPP12A67020C82 | 12 |
499 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SOAFTRR12AF72A8D4D | 1 |
500 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SOANQFY12AB0183239 | 1 |
501 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SOAYATB12A6701FD50 | 1 |
502 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SOBOAFP12A8C131F36 | 7 |
503 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SOBONKR12A58A7A7E0 | 26 |
504 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SOBZZDU12A6310D8A3 | 7 |
505 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SOCAHRT12A8C13A1A4 | 5 |
506 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SODASIJ12A6D4F5D89 | 1 |
507 | d6589314c0a9bcbca4fee0c93b14bc402363afea | SODEAWL12AB0187032 | 8 |
根据你提供的代码理解分析,如下:
#可以使用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 库来绘制
你说的是这种图吧:
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()
最终的效果是这样的:
或者可以参考:
关于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 轴标签的旋转角度,以便更好地显示日期。
希望这可以帮助到你!
如果我的回答解决了您的问题,请采纳!