Построение данных, сгруппированных в кадре данных Pandas на диаграмме рассеяния - PullRequest
0 голосов
/ 26 марта 2019

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

Для целей постановки этого вопроса я построил MWE на основе, очевидно, с разными данными,то, что я получил до сих пор:

import pandas as pd
import matplotlib.pyplot as plt

data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky', 'Jim', 'Lee', 'Rob', 'Dave',
                'Jane', 'Bronwyn', 'Karen', 'Liz', 'Claire', 'Chris', 'Jan', 'Ruby'],
         'Age':[28,34,29,42,14,16,75,68,
                27,3,2,19,17,32,71,45],
         'Weight':[60,75,73,82,54,55,98,82,45,9,8,47,54,62,67,67]}

stages = ['Toddler', 'Teen', ' Young Adult', 'Adult']
ages = [0,4,20,40,100]
df = pd.DataFrame(data)

df['binned'] = pd.cut(df['Age'], bins=ages, labels=stages)

fig=plt.figure()
fig.subplots_adjust(hspace=0) 
fig.subplots_adjust(wspace=0) 
gridsize = 1,4

ax1 = plt.subplot2grid(gridsize, (0,0))
ax1.scatter(df['Name'], df['Weight'], alpha = 0.5)
ax1.set_ylabel('Weight, kg', fontsize=20)
ax1.set_xlabel('Name', fontsize=20)

ax2 = plt.subplot2grid(gridsize, (0,1), sharey=ax1, sharex = ax1)
plt.setp(ax2.get_yticklabels(), visible=False)
ax2.scatter(df['Name'], df['Weight'], alpha = 0.5)
ax2.set_xlabel('Name', fontsize=20)

ax3 = plt.subplot2grid(gridsize, (0,2), sharey=ax1, sharex = ax1)
plt.setp(ax3.get_yticklabels(), visible=False)
ax3.scatter(df['Name'], df['Weight'], alpha = 0.5)
ax3.set_xlabel('Name', fontsize=20)

ax4 = plt.subplot2grid(gridsize, (0,3), sharey=ax1, sharex = ax1)
plt.setp(ax4.get_yticklabels(), visible=False)
ax4.scatter(df['Name'], df['Weight'], alpha = 0.5)
ax4.set_xlabel('Name', fontsize=20)

Это показывает четыре графика, как и ожидалось: enter image description here но как мне заставить каждый график отображать только данные из одного из каждого изурны?Другими словами, как мне нарисовать только одну из корзин?

Меня не беспокоит скручивание имен на оси x, это как раз для этого MWE.Они будут числами на моих реальных графиках.

Просто для пояснения, мои фактические данные сгруппированы как

sources['z bins']=pd.cut(sources['z'], [0,1,2,3, max(z)],
                   labels = ['z < 1', '1 < z < 2', '2 < z < 3', 'z > 3'])

1 Ответ

1 голос
/ 27 марта 2019

Что если вы сгруппировали фрейм данных по binned, а затем нанесли на график каждую группу?

Например:

fig=plt.figure()
fig.subplots_adjust(hspace=0) 
fig.subplots_adjust(wspace=0) 
gridsize = 1,4

for i, (name, frame) in enumerate(df.groupby('binned')):
    ax = plt.subplot2grid(gridsize, (0,i))
    ax.scatter(frame['Name'], frame['Weight'], alpha = 0.5)
    ax.set_xlabel(name, fontsize=20)

enter image description here

Я понимаю, что вы, вероятно, захотите немного почистить метки, но это, по крайней мере, помещает разные ячейки в разные объекты осей.

Вы можете перебирать объект groupby и возвращать имя группы и фрейм данных этой группы. Здесь я использую перечисление для увеличения объекта оси

В качестве альтернативы, если вы не хотите использовать цикл for, вы можете получить доступ к каждой группе с помощью метода get_group объекта groupby.

grouped = df.groupby('binned')

ax1 = plt.subplot2grid(gridsize, (0,0))

ax1.scatter(grouped.get_group('Toddler')['Name'],
            grouped.get_group('Toddler')['Weight'],
            alpha = 0.5)
ax1.set_ylabel('Weight, kg', fontsize=20)
ax1.set_xlabel('Name', fontsize=20)
...