Добавить категорию без данных на участке в Seaborn - PullRequest
0 голосов
/ 29 января 2019

Я строю некоторые данные в виде catplot, как это:

ax = sns.catplot(x='Kind', y='VAF', hue='Sample', jitter=True, data=df, legend=False)

Беда в том, что некоторые категории 'VAF' не содержат данных, и соответствующая метка не добавляется в график,Есть ли способ сохранить метку, но просто не наносить на нее никаких точек?

Вот воспроизводимый пример, который поможет объяснить:

x=pd.DataFrame({'Data':[1,3,4,6,3,2],'Number':['One','One','One','One','Three','Three']})
plt.figure()
ax = sns.catplot(x='Number', y='Data', jitter=True, data=x)

На этом графике вы можете видеть, что наПо оси X отображаются образцы Один и Три.Но представьте, что есть также образец Два, в котором просто нет точек данных.Как я могу отобразить Один, Два и Три на оси X?

1 Ответ

0 голосов
/ 29 января 2019

Параметр заказа

Конечно, нужно знать, какие категории ожидаются.Учитывая список ожидаемых категорий, можно использовать параметр order для предоставления ожидаемых категорий.

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame({'Data':[1,3,4,6,3,2],
                   'Number':['One','One','One','One','Three','Three']})

exp_cats = ["One", "Two", "Three"]

ax = sns.stripplot(x='Number', y='Data', jitter=True, data=df, order=exp_cats)

plt.show()

enter image description here

Альтернативы

Вышесказанное работает с matplotlib 2.2.3, но не с 3.0.Он снова работает с текущей версией разработки (следовательно, 3.1).На данный момент есть следующие альтернативы:

A.Цикл по категориям

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

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

df = pd.DataFrame({'Data':[1,3,4,6,3,2],
                   'Number':['One','One','One','One','Three','Three']})

exp_cats = ["One", "Two", "Three"]

for i, cat in enumerate(exp_cats):
    cdf = df[df["Number"] == cat]
    x = np.zeros(len(cdf))+i+.2*(np.random.rand(len(cdf))-0.5)
    plt.scatter(x, cdf["Data"].values)
plt.xticks(range(len(exp_cats)), exp_cats)

plt.show()

B.Сопоставить категории с числами.

Можно сопоставить ожидаемые категории с числами и номерами участков вместо категорий.

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

df = pd.DataFrame({'Data':[1,3,4,6,3,2],
                   'Number':['One','One','One','One','Three','Three']})

exp_cats = ["One", "Two", "Three"]

df["IntNumber"] = df["Number"].map(dict(zip(exp_cats, range(len(exp_cats)))))

plt.scatter(df["IntNumber"] + .2*(np.random.rand(len(df))-0.5), df["Data"].values,
            c = df["IntNumber"].values.astype(int))
plt.xticks(range(len(exp_cats)), exp_cats)

plt.show()

C.Добавление недостающих категорий к фрейму данных

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

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

df = pd.DataFrame({'Data':[1,3,4,6,3,2],
                   'Number':['One','One','One','One','Three','Three']})

exp_cats = ["One", "Two", "Three"]

dfa = df.append(pd.DataFrame({'Data':[np.nan]*len(exp_cats), 'Number':exp_cats}))

ax = sns.stripplot(x='Number', y='Data', jitter=True, data=dfa, order=exp_cats)

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...