使用pyplot绘制10个客户端多折线图的技术求助
多客户端标签轮次折线图实现方案
假设你的CSV数据有两种常见格式,下面分别给出对应实现方法,确保Y轴包含所有labels列的唯一值,且每条折线对应一个客户端:
情况1:数据为长格式(列:Round, Client, labels)
这种格式下,每一行记录单个客户端某一轮的标签值,示例数据如下:
Round,Client,labels 0,0,0 0,1,2 0,2,1 1,0,1 1,1,3 1,2,0 ...
实现代码:
import matplotlib.pyplot as plt import pandas as pd # 读取CSV数据 df = pd.read_csv('your_data.csv') # 获取所有唯一客户端和标签值 clients = df['Client'].unique() unique_labels = sorted(df['labels'].unique()) # 设置画布 plt.figure(figsize=(10, 6)) # 循环绘制每个客户端的折线 for client in clients: # 筛选当前客户端数据并按轮次排序 client_data = df[df['Client'] == client].sort_values('Round') # 绘制折线,添加标签 plt.plot(client_data['Round'], client_data['labels'], marker='o', label=f'Client {client}') # 配置坐标轴与图例 plt.xlabel('Round') plt.ylabel('Labels') plt.title('Client Label Changes by Round') # 设置Y轴刻度为所有唯一标签值 plt.yticks(unique_labels) plt.legend(loc='upper right') plt.grid(alpha=0.3) plt.show()
情况2:数据为宽格式(列:Round, Client0, Client1, ..., Client9)
这种格式下,每一行对应一轮数据,列是各个客户端的标签值,示例数据如下:
Round,Client0,Client1,Client2 0,0,2,1 1,1,3,0 2,0,2,1 ...
实现代码:
import matplotlib.pyplot as plt import pandas as pd # 读取CSV数据 df = pd.read_csv('your_data.csv') # 获取所有客户端列(排除Round列) client_cols = [col for col in df.columns if col.startswith('Client')] # 提取所有标签的唯一值并排序 all_labels = df[client_cols].values.flatten() unique_labels = sorted(list(set(all_labels))) # 设置画布 plt.figure(figsize=(10, 6)) # 循环绘制每个客户端的折线 for col in client_cols: plt.plot(df['Round'], df[col], marker='s', label=col) # 配置坐标轴与图例 plt.xlabel('Round') plt.ylabel('Labels') plt.title('Client Label Changes by Round') plt.yticks(unique_labels) plt.legend(loc='upper right') plt.grid(alpha=0.3) plt.show()
关键注意事项
- 必须确保数据按
Round排序,否则折线会出现乱序 - 通过
plt.yticks(unique_labels)强制Y轴显示所有标签的唯一值,符合需求 - 添加
marker参数可以让每个数据点更清晰,便于查看轮次对应的标签值
内容的提问来源于stack exchange,提问作者Geetanjli sharma
相关产品推荐
相关产品推荐

