#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
сделать, не было бы таким же простым? Я предполагаю, что вы просто не хотите каждый раз указывать каждое ключевое слово.