Просто чтобы расширить то, что уже сказал @Yann:
Чтобы понять, почему это происходит, вам нужно немного больше узнать о структуре matplotlib. Чтобы разрешить «matlab-isms», такие как plt.setp
, и поддерживать совместимость со старыми версиями python, matplotlib избегает свойств и в значительной степени полагается на геттеры и сеттеры. (plot
на самом деле является одним из самых сложных случаев, просто из-за всех сумасшедших форм вызова, которые он поддерживает.)
Вы можете привести хороший аргумент, что это устаревший, не питонический дизайн, но это не относится к делу.
Что на самом деле происходит (для простейшего случая plot(x, y, other=stuff)
), когда вы вызываете plot
, так это то, что новый объект matplotlib.line.Line2D
создается из первых двух аргументов, а затем вызывается matplotlib.line.Line2D.update(kwargs)
.
update
в основном делает:
for key, value in kwargs.iteritems():
func = getattr(self, 'set_'+key)
func(value)
Я слишком упрощаю, но это основная идея.
Кроме того, список допустимых аргументов ключевого слова в основном автоматически генерируется из всего, что имеет set_*
. Поскольку Line2D
имеет методы set_xdata
и set_ydata
, они отображаются в списке аргументов ключевого слова.
Дело в том, что аргументы ключевого слова фактически никогда не используются до завершения большей части инициализации Line2D
, и если вы не укажете никаких аргументов, plot
не будет инициализировать никаких Line2D
.
Вы можете считать это ошибкой, но я сомневаюсь, что это будет исправлено. Я не думаю, что xdata
и ydata
когда-либо предназначались для использования в качестве аргументов ключевого слова.
set_xdata
и set_ydata
позволяют быстро обновить экземпляр Line2D
вместо создания нового (для анимации и т. д.). Они просто разрешены в качестве аргументов ключевого слова из-за того, как настроена matplotlib.
person
Joe Kington
schedule
23.01.2012
plt.plot(xdata = [1], ydata = [1], color = 'red', marker = 'o')
? Это соответствует вашему первому рабочему примеру. - person Velociraptors   schedule 24.01.2012