Seaborn визуализировать подсчет точек в точечном графике - PullRequest
1 голос
/ 10 июня 2019

Как я могу добавить количество точек на графике точек в морском заливе?

df = pd.DataFrame({'group':[0,1,1],'percentage':[0.5, .3,.7],'value_group':[1,2,3], 'count':[1, 10, 20]})
df['value_group'] = pd.qcut(df.value_group, 2)
   group  percentage  value_group  count
0      0         0.5            1      1
1      1         0.3            2     10
2      1         0.7            3     20

С

sns.pointplot(x="value_group", y="percentage", hue="group", data=df)

Я получаю: enter image description here Но вместо этогоЯ хотел бы: enter image description here

Как этого можно достичь в морском заливе?

edit

Они похожи, но не одинаковы.Моя группа значений получена с использованием pd.qcut и кода, на который ссылается, т.е. не может их обработать.

python Seaborn - аннотации с точечным графиком

import matplotlib.pyplot as plt
import seaborn as sns

tips = sns.load_dataset("tips")
ax = sns.pointplot(x="time", y="total_bill", hue="smoker", data=tips)

for c in ax.collections:
    for of in c.get_offsets():
        ax.annotate("Label", of)

plt.show()

выглядит интересно, но до сих пор я не знаю, как сопоставить правильные метки / индексы с моим количеством.

1 Ответ

1 голос
/ 10 июня 2019

Проблема была немного нетривиальной, о которой я думал.Поскольку вы использовали hue="group", на графике есть две группы, и поэтому ax.collections имеет длину 2. Поэтому, чтобы аннотации были в правильном порядке, я использовал индекс привязки j.

Вы можете сжать смещения и значения DataFrame, которые хотите показать, и аннотировать их с помощью цикла for как

import matplotlib.pyplot as plt
import seaborn as sns
sns.set()

df = pd.DataFrame({'group':[0,1,1],'percentage':[0.5, .3,.7],'value_group':[1,2,3], 'count':[1, 10, 20]})

ax = sns.pointplot(x="value_group", y="percentage", hue="group", data=df)

j = 0 # <--- Index to keep rack of values
values = df['count'].values # <--- store the values in a variable for easy access

for c in ax.collections:
    for i, of in zip(range(len(c.get_offsets())), c.get_offsets()):
        ax.annotate(values[j], of, color='red', fontsize=24)
        j += 1
ax.legend(loc=(0.8, 0.1))
plt.show()

enter image description here

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