Нарисуйте Swarmplot или boxplot в одном топоре в зависимости от количества точек данных - PullRequest
0 голосов
/ 27 июня 2018

У меня есть фрейм данных с несколькими столбцами, где каждый столбец содержит от 5 до 2535 записей (остальное - NAN). Я хочу построить коробочную диаграмму, если в столбце более 9 числовых записей, в противном случае - графическая диаграмма. Я использовал свои безумные навыки рисования, чтобы создать пример. enter image description here

Проблема в том, что я могу отображать только оба наложения, как в в этом примере . Я попытался использовать ключевое слово position, но это работает только для boxplot, а не для swarmplot. Итак, как это можно сделать?

Пример набора данных может быть получен следующим образом:

np.random.seed(1)
df = pd.DataFrame(np.nan, index=range(100), columns=range(11))
for i, column in enumerate(df.columns):
    if i % 2 == 0:
        fill_till = np.random.randint(1,11)
        df.loc[:fill_till-1,column] = np.random.random(fill_till)
    else:
        fill_till = np.random.randint(11,101)
        df.loc[:fill_till-1,column] = np.random.random(fill_till)

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Вы можете создать две копии фрейма данных, одну для блочного графика и одну для ройного графика. Затем в каждой копии установите значения в столбцах , которые вы не хотите отображать таким образом, - nan.

col_mask = df.count() > 9
swarm_data = df.copy()
swarm_data.loc[:, col_mask] = np.nan
box_data = df.copy()
box_data.loc[:, ~col_mask] = np.nan

Затем передайте каждый из скопированных фреймов данных в соответствующую функцию seaborn.

sns.swarmplot(data=swarm_data)
sns.boxplot(data=box_data)
plt.show()

При создании ройного графика морская волна ничего не будет отображать для столбцов, заполненных nan, но оставит место там, где они будут. Обратное произойдет с рамочным графиком, в результате чего ваш порядок столбцов будет сохранен.

Диаграмма, сгенерированная вышеуказанным кодом, выглядит следующим образом:

enter image description here

Этот подход также будет работать для столбцов с нечисловыми метками:

enter image description here

0 голосов
/ 27 июня 2018

Чтобы уточнить комментарии, вот базовый пример (так как вы не предоставляете игрушечный набор данных , его сложно построить, который отражает вашу ситуацию).

import numpy as np
from matplotlib import pyplot as plt
import pandas as pd

#column order
real_order = ["B", "D", "A", "E", "C"]
#first data set
x1 = ["A", "C", "B"]
y1 = [9,     3,   1]
#second dataset
x2 = ["D", "C", "E", "A"]
y2 = [2,    11,   4,   5]

#prepare the axis
plt.plot(real_order, np.repeat(np.nan, len(real_order)))
#fill in bars 
plt.bar(x1, y1, color = "r", label = "bars")
#fill in markers
plt.plot(x2, y2, "b*", label = "markers")
plt.legend()
plt.show()

Выход:

enter image description here

...