передача данных x и y в качестве аргументов ключевого слова в matplotlib?

Или почему не

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

Работа? ср.

> 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>]

person aresnick    schedule 23.01.2012    source источник
comment
Вы пробовали plt.plot(xdata = [1], ydata = [1], color = 'red', marker = 'o')? Это соответствует вашему первому рабочему примеру.   -  person Velociraptors    schedule 24.01.2012


Ответы (2)


Просто чтобы расширить то, что уже сказал @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
comment
Очень полезное объяснение. Весьма признателен. - person J.B. Brown; 30.12.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')

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

person Yann    schedule 23.01.2012