Как изменить смещения matplotlib LineCollection после создания - PullRequest
1 голос
/ 21 июня 2011

Я хотел бы создать стек линейных графиков, используя LineCollection.Следующий код рисует две идентичные кривые синуса, смещенные относительно друг друга на (0, 0,2):

import matplotlib.pyplot as plt
import matplotlib.collections
import numpy as np

x=np.arange(1000)
y=np.sin(x/50.)
l=zip(x,y)

f=plt.figure()
a=f.add_subplot(111)
lines=matplotlib.collections.LineCollection((l,l), offsets=(0,0.2))
a.add_collection(lines)
a.autoscale_view(True, True, True)
plt.show()

Пока все хорошо.Проблема в том, что я хотел бы иметь возможность корректировать это смещение после создания.Использование set_offsets не ведет себя так, как я ожидаю.Следующее, например, не влияет на график

a.collections[0].set_offsets((0, 0.5))

Кстати, остальные команды set (например, set_color) работают, как я ожидаю.Как изменить интервал между кривыми после их создания?

Ответы [ 2 ]

1 голос
/ 21 июня 2011

Я думаю, что вы нашли ошибку в matplotlib, но у меня есть пара обходных путей.Похоже, что lines._paths генерируется в LineCollection().__init__ с использованием предоставленных вами смещений.lines._paths свойство не обновляется, когда вы звоните lines.set_offsets().В вашем простом примере вы можете заново сгенерировать пути, поскольку у вас по-прежнему лежат оригиналы.

lines.set_offsets( (0., 0.2))
lines.set_segments( (l,l) )

Вы также можете применить свои смещения вручную.Помните, что вы изменяете точки смещения.Таким образом, чтобы получить смещение 0,2, вы добавляете 0,1 к ранее существовавшему смещению 0,1.

lines._paths[1].vertices[:,1] += 1
0 голосов
/ 23 июня 2011

Спасибо @matt за ваше предложение.Исходя из этого, я взломал следующее, которое сдвигает кривые в соответствии с новыми значениями смещения, но учитывает старые значения смещения.Это означает, что мне не нужно сохранять исходные данные кривой.Нечто подобное может быть сделано для исправления метода set_offsets в LineCollection, но я недостаточно хорошо понимаю детали этого класса, чтобы рисковать им.

def set_offsets(newoffsets, ax=None, c_num=0):
    '''
        Modifies the offsets between curves of a LineCollection

    '''

    if ax is None:
        ax=plt.gca()

    lcoll=ax.collections[c_num]
    oldoffsets=lcoll.get_offsets()

    if len(newoffsets)==1:
        newoffsets=[i*np.array(newoffsets[0]) for\
         (i,j) in enumerate(lcoll.get_paths())]
    if len(oldoffsets)==1:
        oldoffsets=[i*oldoffsets[0] for (i,j) in enumerate(newoffsets)]

    verts=[path.vertices for path in lcoll.get_paths()]

    for (oset, nset, vert) in zip(oldoffsets, newoffsets, verts):
        vert[:,0]+=(-oset[0]+nset[0])
        vert[:,1]+=(-oset[1]+nset[1])

    lcoll.set_offsets(newoffsets)
    lcoll.set_paths(verts)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...