在散点图中绘制在熊猫数据框中分类的数据

时间:2019-03-26 20:09:46

标签: pandas dataframe matplotlib plot binning

我需要在散点图中绘制大量的天文数据。我已经根据距离对数据进行了分类,我想并排绘制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 但是,如何使每个图只绘制来自每个bin之一的数据?换句话说,我如何只绘制其中一个垃圾箱?

我不担心在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 个答案:

答案 0 :(得分:1)

如果您将数据框按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循环,则可以使用groupby对象的get_group方法访问每个组。

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)