在Python中创建多色散点图

时间:2018-10-17 04:07:10

标签: python python-3.x dataframe matplotlib scatter-plot

我有一个熊猫数据框,其中包含我要绘制的数据,但我想根据动物的性别来更改圆点的颜色。我尝试了多种方法来使它正常工作。首先,我尝试根据df列“ Sex”对字典进行索引

figure = plt.figure(figsize=(20, 6))
axes = figure.add_subplot(1, 2, 1)
clr = {'M':'firebrick','F':'blueviolet', 'I':'beige'}
axes.scatter( data[ "Whole Weight"], data['Shucked Weight'],color=clr[str(data['Sex'])])
axes.set_ylabel( "Shucked Weight")
axes.set_xlabel( "Whole Weight")
axes.set_title("Whole Weight vs. Shucked Weight")

plt.show()
plt.close()

那给了我很多关键错误。接下来,我尝试遍历df并根据行值手动添加列:

for x1 in data['Sex']:
    if x1 == 'M':
        print(x1,)
        data['color'] = 'firebrick'
    elif x1 == 'F':
        data['color'] = 'blueviolet'
    else:
        data['color'] = 'bisque1'

我试图从头开始制作其中包含值的字典:

weight_dict = pd.DataFrame(dict(whole = data['Whole Weight'], shucked = data['Shucked Weight'], sex = data['Sex'], color= some if statement that choked))

我尝试使用np.where语句,但是我有3种性别选择(男,女和婴儿,缩写为M,F,I)

data['color'] = np.where(data.Sex == 'M', 'Firebrick', (data.Sex == 'F', 'blueviolet','beige'))

最后我得到了这个工作:

def label_color(row):
    if row['Sex'] == 'M':
        return 'firebrick'
    elif row['Sex'] == 'F':
        return 'blueviolet'
    else:
        return 'beige'
data['color'] = data.apply(lambda row: label_color(row), axis=1)

但是我对解决方案并不满意。我真的希望第一个解决方案在我有一个自定义词典的情况下工作,并在调用axes.scatter的过程中对其进行查找,但是错误却很奇怪而且无法理解。

有没有更简单的方法来解决这种疯狂问题?

1 个答案:

答案 0 :(得分:2)

我认为您在第一次尝试时几乎正确。

我会将字典应用于将性别映射为颜色的新列。像

df = pd.DataFrame(columns=["ww", "sw", "sex"])
df["ww"] = np.random.randn(500)
df["sw"] = np.random.randn(500)
df["sex"] = np.random.choice(["M", "F", "I"], size=500)

clr = {'M':'firebrick','F':'blueviolet', 'I':'yellow'}
df["color"] = df["sex"].apply(lambda x: clr[x])

plt.scatter(df["ww"], df["sw"], color=df["color"], alpha=0.7)

enter image description here

或者,如果您不想使用新的列,或者字典可以在分散调用之间更改,您可以这样做

plt.scatter(df["ww"], df["sw"], color=df["sex"].apply(lambda x: clr[x]), alpha=0.7)

不确定是否仅使用词典是否有更好的解决方案,但是鉴于您已经将数据存储在熊猫中,所以我认为可以使用它。