Pyplot散点图大小和颜色不匹配

时间:2018-10-18 20:28:42

标签: python matplotlib seaborn

我试图从熊猫数据框中创建简单的散点图,将column1与column2相对应,并使用column3(布尔值)作为颜色和大小。但是,尽管颜色和大小数组符合预期的匹配,它们仍适用于绘图中的不同点。

>>> colors = ['white' if not val else 'red' for val in df.column3.values]
>>> size = [5 if not val else 30 for val in df.column3.values]
>>> plt.scatter(df['column1'].values, df['column2'].values, c=colors, s=size)
>>> print zip(colors, size)
[('white', 5),
 ('white', 5),
 ('red', 30),
 ('red', 30),
 ('white', 5),
 ...]

enter image description here

为什么会这样?

E:为明确起见,colorsize数组中的每个 元素均正确配对:

>>> for pair in zip(colors, size):
...     if (pair[0] == 'white' and pair[1] != 5) or (pair[0] == 'red' and pair[1] != 30):
...         print pair
[]

2 个答案:

答案 0 :(得分:0)

  

为什么会这样?

可能是因为通常不能保证您具有两个不同的数据框列以在同一位置包含Falsey数据。

>>> colors = ['white' if not val else 'red' for val in df.column3.values]
>>> size = [5 if not val else 30 for val in df.column2.values]

colors是根据df.column3创建的,而size是根据df.column2创建的(我想也许您 meant 可以生成size来自df.column3)。

对于列中的虚假数据,不能保证'white'总是与5配对,并且'red'总是与30配对。如果您希望'white'总是与5配对,而'red'总是与30配对,那么最好从颜色生成尺寸:

>>> colors = ['white' if not val else 'red' for val in df.column3.values]
>>> size = [5 if val == 'white' else 30 for val in colors]

那你就不会错了。

HTH。

答案 1 :(得分:0)

此问题已解决。 column1column2中有未绘制的空值,但是在colorsize数组中没有跳过这些空值。您需要确保仅使用其他两列都不为空的行创建colorsize数组,例如

>>> tmpdf = df[~pd.isnull(df['column1']) & ~pd.isnull(df['column2]')]
>>> colors = ['white' if not val else 'red' for val in tmpdf.column3.values]
>>> size = [5 if not val else 30 for val in tmpdf.column3.values]
>>> plt.scatter(tmpdf['column1'].values, tmpdf['column2'].values, c=colors, s=size)

enter image description here