如何绘制样本列表中字符串项目位置出现占比的可视化图表
Got it!这个需求很清晰,咱们用Python的pandas+seaborn就能轻松实现,我给你拆解成数据预处理、百分比计算、图表绘制三个步骤,代码直接套用就行~
实现方案
1. 数据预处理:读取并解析有序项目列表
首先要把CSV里的有序项目列表拆分成对应位置的列,方便后续统计。假设你的项目列表是用逗号分隔的字符串(比如"A,S,P,X,N,R"),代码如下:
import pandas as pd # 替换成你的CSV文件路径 df = pd.read_csv("your_samples.csv") # 拆分有序项目列表为多列,每列对应一个位置 split_cols = df["有序项目列表"].str.split(",", expand=True) # 给拆分后的列命名为「位置1」「位置2」... split_cols.columns = [f"位置{i+1}" for i in range(split_cols.shape[1])] # 合并回原DataFrame(可选,方便查看全量数据) df = pd.concat([df, split_cols], axis=1)
如果你的项目列表用的是其他分隔符(比如分号),把
str.split(",")里的逗号换成对应符号即可。
2. 计算每个位置各标签的出现百分比
接下来要统计每个位置中,A/S/P/X/N/R各自的出现次数,再转换成占该位置总样本数的百分比:
# 把位置列转成长格式,方便分组统计 melted = split_cols.melt(var_name="位置", value_name="标签") # 统计每个位置每个标签的出现次数 counts = melted.groupby(["位置", "标签"]).size().reset_index(name="次数") # 计算每个位置的总样本数 total_counts = melted.groupby("位置").size().reset_index(name="总次数") # 合并数据并计算百分比 counts = counts.merge(total_counts, on="位置") counts["百分比"] = (counts["次数"] / counts["总次数"]) * 100 # 补全缺失数据:确保6个标签在每个位置都有记录(避免某些标签在某位置没出现导致绘图缺失) all_labels = ['A', 'S', 'P', 'X', 'N', 'R'] all_positions = split_cols.columns full_index = pd.MultiIndex.from_product([all_positions, all_labels], names=["位置", "标签"]) counts = counts.set_index(["位置", "标签"]).reindex(full_index, fill_value=0).reset_index()
3. 绘制目标图表
用seaborn的点图来展示每个位置各标签的百分比,视觉上清晰直观:
import seaborn as sns import matplotlib.pyplot as plt # 设置绘图风格 sns.set_style("whitegrid") # 创建画布,调整尺寸 plt.figure(figsize=(12, 6)) # 绘制点图:X轴是位置,Y轴是百分比,不同标签用不同标记区分 sns.pointplot( data=counts, x="位置", y="百分比", hue="标签", palette="tab10", markers=["o", "s", "^", "D", "v", "*"], # 给每个标签分配独特标记 linestyles="" # 不画连接线,只显示点 ) # 设置图表标题和轴标签 plt.title("各标签在不同位置的出现百分比", fontsize=14) plt.xlabel("位置", fontsize=12) plt.ylabel("出现百分比(%)", fontsize=12) # 调整图例位置,避免遮挡图表 plt.legend(title="标签", bbox_to_anchor=(1.05, 1), loc="upper left") # 自动调整布局,保存图表(可选) plt.tight_layout() # plt.savefig("标签位置分布.png", dpi=300) plt.show()
额外说明
- 如果你的样本中存在项目列表长度不一致的情况,拆分后会出现
NaN值,你可以根据需求用dropna()过滤掉无效样本,或者用特定值填充。 - 要是需要调整图表样式(比如颜色、标记大小),直接修改
pointplot里的参数即可。
内容的提问来源于stack exchange,提问作者Manner
相关产品推荐
相关产品推荐

