Создание двух морских графиков с одинаковой осью - PullRequest
0 голосов
/ 28 мая 2019

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

Я пытался использовать объекты счетчика в python, но ось графика не совпадала с показаниями на графике, так как словари python неупорядочены.

import seaborn as sns


first_list = ["a", "b", "c", "d", "e", "a", "b", "c", "a", "b","n"]
second_list = ["a","b","c","d", "e", "e","d","c","e","q"]


sns.countplot(first_list, color="blue", alpha=.5)
sns.countplot(second_list, color="red",alpha=.5)


plt.show()

Приведенный выше код должен отображать график, включающий частоты для уникальных значений «n» и «q», но отображать график, ось которого включает в себя только значения из второго списка.

1 Ответ

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

Я думаю, что было бы лучше объединить ваши данные в один фрейм данных, который вы передаете в seaborn, вместо того, чтобы создавать два графика друг над другом. Я вызвал sns.barplot на счетчики вместо того, чтобы использовать sns.countplot для исходных необработанных значений.

#convert the lists to series and get the counts
first_list = pd.Series(
    ["a", "b", "c", "d", "e", "a", "b", "c", "a", "b","n"]
).value_counts()

second_list = pd.Series(
    ["a","b","c","d", "e", "e","d","c","e","q"]
).value_counts()

#get the counts as a dataframe
df=pd.concat([first_list,second_list],axis=1)
df.columns=['first','second']

# melt the data frame so it has a "tidy" data format
df=df.reset_index().melt(id_vars=['index'])
df

   index variable  value
0      a    first    3.0
1      b    first    3.0
2      c    first    2.0
3      d    first    1.0
4      e    first    1.0
5      n    first    1.0
6      q    first    NaN
7      a   second    1.0
8      b   second    1.0
9      c   second    2.0
10     d   second    2.0
11     e   second    3.0
12     n   second    NaN
13     q   second    1.0


#plot a bar graph and assign variable to hue
sns.barplot(
    x='index',
    y='value',
    hue='variable',
    data=df,
    palette=['blue','red'],
    alpha=.5,
    dodge=False,
)

plt.show()

The final plot

...