要从三个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']# 绘制小提琴图 plt.figure(figsize=(10, 6)) sns.violinplot(x='Label', y='S30/(km2)', data=combined_df) # plt.title('Violin Plot of S30/(km2) for Different Distances') plt.xlabel('Distance (km)') plt.ylabel('S30/(k${m^2}$)') plt.xticks(rotation=0) # 旋转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)
的值。