Передача x- и y-данных в качестве аргументов ключевых слов в matplotlib? - PullRequest
5 голосов
/ 24 января 2012

Или, почему не

import numpy
import matplotlib.pyplot as plt
plt.plot(xdata = numpy.array([1]), ydata = numpy.array(1), color = 'red', marker = 'o')

работа? c.f.

> In [21]: import numpy

> In [22]: import matplotlib.pyplot as plt

> In [23]: plt.plot(xdata = numpy.array([1]), ydata = numpy.array(1), color = 'red', marker = 'o')
> Out[23]: []

> In [24]: plt.plot([1],[1], color = 'red', marker = 'o')
> Out[24]: [<matplotlib.lines.Line2D at 0x108036890>]

> In [25]: plt.plot(1, 1, color = 'red', marker = 'o')
> Out[25]: [<matplotlib.lines.Line2D at 0x1041024d0>]

Ответы [ 2 ]

12 голосов
/ 24 января 2012

Просто чтобы расширить то, что @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 методы, они отображаются в списке аргументов ключевого слова.

Дело в том, что аргументы ключевого слова фактически никогда не используются до тех пор, пока не будет завершена большая часть инициализации * 1027.*, и если вы не укажете никаких аргументов, plot не будет инициализировать Line2D.

Вы можете считать это ошибкой, но я сомневаюсь, что это будет исправлено.Я не думаю, что xdata и ydata когда-либо предназначались для использования в качестве аргументов ключевых слов.

set_xdata и set_ydata позволяют быстро обновлять экземпляр Line2D вместо создания нового (для анимации и т. Д.).Просто они могут быть разрешены в качестве аргументов ключевых слов из-за способа установки matplotlib.

4 голосов
/ 24 января 2012

Почему? Кто знает, но кажется, что строка не создается, если вы не определите x и y аргументы. xdata и ydata изменяют данные строки , только если они созданы , и кажется, что они не созданы без параметров. Попробуйте это:

plt.plot([0],[0],xdata = [1,2,3,4], #numpy.array([3,4]),
               ydata = [4,5,6,7], #numpy.array([3,4]), 
               color = 'red', 
               marker = 'o')

Это работает так, как я думаю, вы собираетесь

...