python 一口气画三类提琴图对比
要从三个CSV文件中提取指定列名(这里是s2),并绘制小提琴图,其中横坐标是11km、17km、23km,纵坐标名称是S30/(km2),你可以使用Python的pandas库来处理CSV数据,seaborn库来绘制小提琴图,以及matplotlib库来设置图形属性。以下是一个完整的示例代码:
#!usr/bin/env python # -*- coding:utf-8 -*- """ @author: Suyue @file: violin.py @time: 2025/01/18 @desc: """ import pandas as pd import seaborn as sns import matplotlib matplotlib.use('TkAgg') import matplotlib.pyplot as plt # CSV文件路径和对应的横坐标标签 csv_files = { '11km': '/5_area_.csv', '17km': '/8_area_.csv', '23km': '/11_area_.csv' } # 提取数据 data_frames = [] for label, file_path in csv_files.items(): df = pd.read_csv(file_path) if 's3' in df.columns: df['Label'] = label # 添加标签列 data_frames.append(df[['s3', 'Label']]) # 只保留s3列和标签列 else: raise ValueError(f"Column 's3' not found in {file_path}") # 合并数据框 combined_df = pd.concat(data_frames, ignore_index=True) # 重命名列以匹配图形要求 combined_df.columns = ['S30/(km2)', 'Label'] # 设置颜色列表(这里使用三种不同的颜色) colors = ['skyblue', 'olivedrab', 'orchid'] # 绘制小提琴图 plt.figure(figsize=(10, 6)) ax = sns.violinplot(x='Label', y='S30/(km2)',palette=colors,data=combined_df) # 设置y轴刻度大小 ax.tick_params(axis='y',labelsize=18) # plt.title('Violin Plot of S30/(km2) for Different Distances') plt.xlabel('Distance (km)',fontsize=18) plt.ylabel('S${_3}$${_0}$/(k${m^2}$)',fontsize=18) plt.xticks(rotation=0,fontsize=18) # 旋转x轴标签以便更好地显示 plt.tight_layout() # 自动调整子图参数, 使之填充整个图像区域 plt.show()
代码解释
- CSV文件路径和对应的横坐标标签:
csv_files字典包含每个CSV文件的路径和对应的横坐标标签(11km、17km、23km)。
- 提取数据:
- 遍历
csv_files字典,使用pd.read_csv读取每个文件。 - 检查
s2列是否存在,如果存在,则添加标签列Label并将数据框添加到data_frames列表中。
- 遍历
- 合并数据框:
- 使用
pd.concat将所有数据框合并为一个。
- 使用
- 重命名列:
- 将合并后的数据框中的列名从
s2和Label更改为S30/(km2)和Label,以匹配图形要求。
- 将合并后的数据框中的列名从
- 绘制小提琴图:
- 使用
seaborn.violinplot函数绘制小提琴图。 - 设置图形的大小、标题、轴标签和x轴标签的旋转角度。
- 使用
plt.tight_layout()来确保所有标签和标题都可见且不会重叠。
- 使用
确保你的CSV文件路径和列名与代码中的一致。运行这段代码后,你将得到一个小提琴图,其中横坐标表示不同的距离(11km、17km、23km),纵坐标表示S30/(km2)的值。
结果:


浙公网安备 33010602011771号