Размер и цвет разброса Pyplot не совпадают - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь создать простую диаграмму рассеяния из кадра данных pandas, нанося столбец 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: Чтобы уточнить, каждый элемент в массивах color и size правильно спарен:

>>> 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 голосов
/ 19 октября 2018

Это было решено.В column1 и column2 были нули, которые не отображались, но эти нули не пропускались в массивах color и size.Вам необходимо убедиться, что вы создаете массивы color и size только с использованием строк, в которых ни один из двух других столбцов не имеет нулевого значения, например,

>>> 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

0 голосов
/ 18 октября 2018

Почему это происходит?

Возможно, потому что вы не гарантированы (в общем случае) иметь два разных столбца данных для размещения данных 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 (думаю, возможно, вы имели в виду для генерации 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...