我找到了两个问题的解决方案。
编辑:删除了旧问题,以便更轻松地在帖子中查找解决方案。
Seaborn是基于matplotlib的Python数据可视化库。要使用Seaborn,您的数据必须位于tidy format中。
您可以使用Pandas DataFrame.loc[]过滤数据帧。
[在以下示例中,我将(1)将CSV文件中的某些数据加载到数据帧中;(2)根据列中的特定值过滤该数据;(3)使用Seaborn在箱图中显示该数据;( 4)确定数据显示的顺序以及应使用的标签。
一些示例数据
Object,Metric,Score
M11,B2A10,2.7939033333333336
MT1,B2A10,1.287634388888889
MT1,B2A1,7.1535
MT1,B2A2,2.2441833333333334
MT1,B2A3,3.3787333333333334
MT1,B2A4,2.50297
MT1,B2A5,1.4254989999999998
MT1,B2A6,2.91325
MT1,B2A7,1.24806
MT1,B2A8,2.08797725
MT1,B2A9,1.208722
import pandas as pd
import seaborn as sns
sns.set(style="whitegrid", palette="colorblind")
data = pd.read_csv("data.csv")
list = ["B2A10", "B2A1"]
filtered_data = data.loc[data['Metric'].isin(list)]
fig, ax = plt.subplots(figsize=(10,6))
ax = sns.boxplot(x='Metric', y='Length', data=samples, order=["B2A1", "B2A10"])
ax = sns.swarmplot(x="Metric", y="Length", data=samples, color=".25", order=["B2A1", "B2A10"])
ax.set_xlabel('Label X-Axis')
ax.set_ylabel('Label Y-Axis')
plt.title('Title',fontsize=16)
labels = [item.get_text() for item in ax.get_xticklabels()]
labels[0] = 'Sample 1'
labels[1] = 'Sample 2'
ax.set_xticklabels(labels)
plt.savefig('test.png', dpi=300, bbox_inches='tight')
最终图形应如下所示。
我将在下面回答您的两个问题。
1]要对绘图中的值进行排序(例如,按Score
进行排序),您可以先通过“分数”对Metric
(您将其用作箱线图的order
参数)进行排序:] >
sorted_order = [x for _, x in sorted(zip(score_tidy.Score, score_tidy.Metric))]
然后将
order=sorted_order
传递给您的箱线图调用。
2)要更改任何基于matplotlib的图的xticks标签(例如,通过seaborn生成的图),您可以获取轴的手柄(以下通过plt.gca()
获取当前轴),并执行以下操作:]
plt.gca().set_xticks(np.arange(0, len(sorted_order)), sorted_order)
这样,您将从
Metrics
中获得xticks标签,并根据Score
进行排序。
我找到了两个问题的解决方案。
(1)第一种解决方案是简单地从原始数据中筛选出我想要的项目,然后另存为新的数据文件。我认为这不是最佳选择,但可以满足我的目的。我认为直接根据图中显示的内容进行过滤会更加有效。
# Load list data data = pd.read_csv('data.csv') # Define items items = ['item1', 'item2', 'item3'] # Filter items using Pandas isin() function items_1_3 = data[data.Column.isin(items)] items_1_3.to_csv('data_1_3.csv', index=False)
((2)我找到了一种根据其位置更改图形标签的方法(请记住,Python从0开始计数,而不是1)。我在定义图形的位置之后直接添加此代码。
labels = [item.get_text() for item in ax.get_xticklabels()] labels[0] = 'one' labels[1] = 'two' labels[2] = 'three' ax.set_xticklabels(labels)
希望有人会发现这很有用。
我找到了两个问题的解决方案。