Фильтрация данных и изменение меток на диаграммах Seaborn boxplot - PullRequest
0 голосов
/ 26 мая 2020

EDIT: удален старый вопрос, чтобы упростить поиск решения в сообщении.

Seaborn - это библиотека визуализации данных Python на основе matplotlib . Чтобы использовать Seaborn, ваши данные должны быть в формате tidy .

Вы можете использовать Pandas DataFrame.loc [] для фильтрации фрейма данных.

В следующем примере я (1) загружу некоторые данные из файла CSV в фрейм данных, (2) отфильтрую эти данные на основе определенных c значений в столбце, (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"]

Отфильтровать данные с использованием .lo c и поместить в новый фрейм данных

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')

Окончательный график должен выглядеть следующим образом.

enter image description here

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Я нашел решения для обеих проблем.

(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)

Надеюсь, кто-то сочтет это полезным.

0 голосов
/ 26 мая 2020

Я отвечу на оба ваших вопроса ниже.

1) Чтобы отсортировать значения на графике (например, сортировка по Score), вы можете сначала отсортировать Metric (который вы используете как order параметр для блочной диаграммы) с помощью 'Score', выполнив следующие действия:

sorted_order = [x for _, x in sorted(zip(score_tidy.Score, score_tidy.Metric))]

Затем передайте order=sorted_order вызову блочной диаграммы.

2) Чтобы изменить метки xticks любого график на основе matplotlib (например, сгенерированный с помощью seaborn), вы можете получить ручку ваших осей (взяв текущую в следующем через plt.gca()) и сделать это:

plt.gca().set_xticks(np.arange(0, len(sorted_order)), sorted_order)

Таким образом вы получите ваши ярлыки xticks из Metrics, отсортированные по Score.

...