2016-10-07 4 views
1

Документация Matplotlib для scatter() состояний:Matplotlib график рассеяния: Как использовать данные = рассуждение

В дополнение к описанным выше аргументам, эта функция может принимать аргумент ключевых данных. Если такой аргумент данных задан, следующие аргументы заменяются данными []:

Все аргументы со следующими именами: 's', 'color', 'y', 'c', 'linewidths', ' facecolor ',' facecolors ',' x ',' edgecolors '.

Однако я не могу понять, как заставить это работать. Минимальный пример

import matplotlib.pyplot as plt 
import numpy as np 

data = np.random.random(size=(3, 2)) 
props = {'c': ['r', 'g', 'b'], 
     's': [50, 100, 20], 
     'edgecolor': ['b', 'g', 'r']} 

plt.scatter(data[:, 0], data[:, 1], data=props) 
plt.show() 

производит участок с цветом и размерами по умолчанию, а не входит в комплект.

Кто-нибудь использовал эту функциональность?

ответ

0

Это, кажется, забывают особенность добавили около двух лет назад. В примечаниях к выпуску приведен краткий пример ( https://matplotlib.org/users/prev_whats_new/whats_new_1.5.html#working-with-labeled-data-like-pandas-dataframes). Помимо этого вопроса и короткого сообщения в блоге (https://tomaugspurger.github.io/modern-6-visualization.html), это все, что я мог найти.

В принципе, любой аргумент-подобный объект («помеченные данные», как его называют документы) передается в аргументе data, а параметры графика задаются на основе его ключей. Например, вы можете создать структурированный массив с полями a, b и c

coords = np.random.randn(250, 3).view(dtype=[('a', float), ('b', float), ('c', float)]) 

Вы обычно создать участок a против b использованием

pyplot.plot(coords['a'], coords['b'], 'x') 

, но с помощью аргумента данных может быть сделано с

pyplot.plot('a', 'b','x', data=coords) 

этикетка b можно спутать Wi th строка стиля, устанавливающая линию на синий, но третий аргумент очищает эту двусмысленность. Это не ограничено данными x и y, либо

pyplot.scatter(x='a', y='b', c='c', data=coords) 

Будет установлен точечный цвет на основе столбца 'c'.

Похоже, эта функция была добавлена ​​для фреймов данных pandas и обрабатывает их лучше, чем другие объекты.Кроме того, он плохо документирован и несколько нестабилен (с использованием x и y аргументов ключевого слова не удается выполнить команду plot, но отлично работает с scatter, сообщения об ошибках не помогают). Это, как говорится, дает хорошее сокращение, когда данные, которые вы хотите построить, имеют метки.

+0

Благодарим вас за ответ. Через год, я думаю, я в основном отказался от этого синтаксиса, и я не могу сказать, что я пропустил его в конце концов. Но в любом случае я полностью неправильно понял документацию по этому поводу, теперь это имеет смысл с вашими примерами. –

0

В ссылке на вашем примере, я думаю, что следующий делает то, что вы хотите:

plt.scatter(data[:, 0], data[:, 1], **props) 

Этот бит в документации сбивает с толку меня, и, глядя на источники, scatter в axes/_axes.py, кажется, не делать ничего с этот аргумент data. Остальные kwargs заканчиваются в качестве аргументов PathCollection, возможно, там есть ошибка.

Вы также можете установить эти параметры после scatter с различными set методами PathCollection, например .:

pc = plt.scatter(data[:, 0], data[:, 1]) 
pc.set_sizes([500,100,200]) 
+0

Спасибо за ваш ответ. Очевидно, я мог бы напрямую передать массивы в качестве аргументов функции. Я работаю над некоторым большим кодом, где использование аргумента data = может значительно упростить мой код, поэтому мне было любопытно. Я также проверил код из 'scatter()' и проследил использование 'data' в функции' update' в классе 'Artist', но даже тогда я не могу понять, что он делает. –

+0

Не использовал бы '** props' в сравнении с тем, что мы ожидаем от' data = props', чтобы сделать так же просто? Я предполагаю, что вы просто не хотите указывать каждое ключевое слово каждый раз. – tsj

Смежные вопросы