точечная диаграмма matplotlib: как использовать аргумент data=

#matplotlib #scatter-plot

#matplotlib #точечная диаграмма

Вопрос:

Документация matplotlib для scatter() состояний:

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

Все аргументы со следующими именами: ‘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()
  

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

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

Ответ №1:

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

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

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

Обычно вы бы создали график a vs b , используя

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

но, используя аргумент data, это можно сделать с помощью

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

Метку b можно спутать со строкой стиля, в которой строка отображается синим цветом, но третий аргумент устраняет эту двусмысленность. Он также не ограничивается данными x и y,

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

Установит цвет точки на основе столбца ‘c’.

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

Комментарии:

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

Ответ №2:

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

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

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

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

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

Комментарии:

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

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