我有一个熊猫数据框,其中包含我要绘制的数据,但我想根据动物的性别来更改圆点的颜色。我尝试了多种方法来使它正常工作。首先,我尝试根据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的过程中对其进行查找,但是错误却很奇怪而且无法理解。
有没有更简单的方法来解决这种疯狂问题?
答案 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)
或者,如果您不想使用新的列,或者字典可以在分散调用之间更改,您可以这样做
plt.scatter(df["ww"], df["sw"], color=df["sex"].apply(lambda x: clr[x]), alpha=0.7)
不确定是否仅使用词典是否有更好的解决方案,但是鉴于您已经将数据存储在熊猫中,所以我认为可以使用它。