2016-11-08 1 views
0

Я новичок в Python и matplotlib, и я недавно ссылался на THIS, чтобы обновить мой участок tripcolor. При следующем подготовки данныхset_array() в ошибке tripcolor?

import numpy as np 
import matplotlib.pyplot as plt 
import matplotlib.tri as tri 
import math 

r = np.zeros((100,100)) 
t = np.zeros((100,100)) 
for i in range(0,100): 
    for j in range(0,100): 
     r[i,j]=i 
     t[i,j]=2*math.pi*j/100 
x=r*np.cos(t) 
y=r*np.sin(t) 
z=r*r 

xf=x.flatten() 
yf=y.flatten() 
zf=z.flatten() 
triang = tri.Triangulation(xf,yf) 

Если я использую tripcolor, как предполагается,

# Works well 
p = plt.tripcolor(triang, zf) 

correct figure появляется. Но, если я пытаюсь обновить после создания tripcolor,

# Not working well 
p = plt.tripcolor(triang, xf) 
p.set_array(zf) 

тогда, wrong figure появляется. Оба xf и zf имеют одинаковые размеры.

Что я делаю неправильно? В чем причина проблемы и как ее избежать?

Большое спасибо заранее.

================================================================================================================================== ===========

Update

Спасибо всем. Я на самом деле решил сам.

Ключа в том, что мне нужно назначить цвета для каждой области, которая находится под контролем shading аргумента и значение по умолчанию для tripcolor является 'flat', который, цвета для каждой вершины. Итак, когда я рисую первый рисунок, мне нужно убедиться, что затенение 'gouraud', которое назначает цвет для каждой области.

Так,

p = plt.tripcolor(triang, xf, shading='gouraud') 
p.set_array(zf) 

работает, как я предполагал.

+0

так как связанный пост был вам полезен, вы могли бы (и должны?) Поддержать ответ, который там размещен ... даже если это только помогло вам, но не решило вашу проблему. – rll

+0

@ rll Я сделал это, но, поскольку моя репутация низкая, моя обратная связь не показана другим людям, мне сказали. –

+0

Извините, мой плохой тогда :) Я читал ваш вопрос с большим вниманием, попробовал ли вы перерисовать после установки массива? – rll

ответ

0

Причина

p = plt.tripcolor(triang, xf) 
p.set_array(zf) 

не работает, как (может быть) и следовало ожидать, состоит в следующем. В вашем случае plt.tripcolor() возвращает PolyCollection. PolyCollection's set_array() будет по существу устанавливать цвета этой коллекции. Однако основные треугольники не будут изменены, так что вы получите треугольники от xf, но цвета от zf.

Поскольку генерация трикотажа PolyCollection весьма вовлекается (поскольку он вызывает Triangulation) и, вероятно, нет вспомогательной функции для установки данных извне (по крайней мере, я не знаю никого), решение может быть не обновите tripcolor вообще и вместо этого создайте новый.

У вас есть причина для обновления? Не могли бы вы просто создать p = plt.tripcolor(triang, zf)?

В случае, если для этого есть реальная причина, например, в анимации или в таком случае, выбор будет состоять в том, чтобы удалить первый график расцветки перед настройкой следующего.

# create one plot 
p = plt.tripcolor(triang, xf) 
#delete this plot (you need both lines actually!!) 
p.remove() 
del p 
#create second plot 
p = plt.tripcolor(triang, zf) 

Это не очень эффективно, и если у кого-то есть лучшая идея, я бы тоже хотел услышать об этом.

+0

Благодарим вас за то, что поделились своим решением. Тем не менее, отсутствие средств для контроля только данных меня смущает. 'triang' построен из' xf' и 'yf', которые имеют одинаковые размеры с' zf'. Нужно только менять цвета, и это казалось простым. С другой стороны, согласно вашему диагнозу, я думаю, создавая с ** 'zf' **; 'p = plt.tripcolor (triang, zf)', затем снова установите массив на ** 'zf' **; 'p.set_array (zf)' должно быть хорошо, но я снова получил эту неправильную цифру. Подобный узор, немного другой цвет. –

+0

Возможно, вы захотите посмотреть исходный код 'tripcolor', чтобы увидеть, что нужно, чтобы« просто »изменить цвета. В конце концов, это не имеет большого значения, если вы делаете все это самостоятельно, или если вы удаляете объект и создаете новый. 'p.set_array (zf)' по-прежнему отличается от вызова 'plt.tripcolor (triang, zf)', потому что есть встроенный шаг триангуляции. – ImportanceOfBeingErnest

Смежные вопросы