2015-02-28 4 views
3

Возможно ли создать RegularPolyCollection со статическими размерами?Matplotlib RegularPolyCollection со статическими (данными) размерами?

Я бы хотел указать размер в единицах данных, а не в единицах экрана. Так же, как смещения.

Целью является изображение камеры с 1440 гексагональными пикселями диаметром 9,5 мм.

можно добиться с циклом по 1440 многоугольников, но я не был преуспевающим его создания с PolyCollection, которая имеет большие преимущества, для создания цветовых карт и т.д.

Вот код, я использую для построения 1440 шестиугольников со статическим размером:

for c, x, y in zip(pixel_color, pixel_x, pixel_y): 
    ax.add_artist(
     RegularPolygon(
      xy=(x, y), 
      numVertices=6, 
      radius=4.75, 
      orientation=0., 
      facecolor=c, 
      edgecolor=edgecolor, 
      linewidth=1.5, 
     ) 
    ) 

и этот код производит то же самое, но с неправильным и не статичен (с точки зрения данных) размеры:

a = 1/np.sqrt(3) * 9.5 

collection = RegularPolyCollection(
    numsides=6, 
    rotation=0., 
    sizes=np.ones(1440)*np.pi*a**2, # tarea of the surrounding circle 
    facecolors=pixel_colors, 
    edgecolors="g", 
    linewidth=np.ones(1440)*1.5, 
    offsets=np.transpose([pixel_x, pixel_y]), 
    transOffset=self.transData, 
) 

self.add_collection(collection) 

Как достичь статических размеров шестиугольников с преимуществами наличия коллекции?

ответ

0

У меня недавно была та же проблема. Решение состоит в том, чтобы просто использовать PatchCollection вместо RegularPolyCollection. Однако недостатком является то, что вы создаете каждый отдельный патч вручную. Ниже вы найдете пример кода, который отображает 10 000 правильных шестиугольников на обычной сетке.

# imports 
import matplotlib.pyplot as plt 
from matplotlib.patches import RegularPolygon 
from matplotlib.collections import PatchCollection 
import numpy as np 

# set up figure 
fig, ax = plt.subplots(1) 

# positions 
pixel_x, pixel_y = np.indices((100, 100)) 
pixel_color = np.random.random_sample(30000).reshape(10000, 3) 
dx = 4 # horizontal stride 
dy = 5 # vertical stride 

# set static radius 
poly_radius = 2.5 

# list to hold patches 
patch_list = [] 

# creat the patches 
for c, x, y in zip(pixel_color, pixel_x.flat, pixel_y.flat):  
    patch_list.append(
      RegularPolygon(
        xy=(x*dy, y*dy), 
        numVertices=6, 
        radius=poly_radius, 
        orientation=0., 
        facecolor=c, 
        edgecolor='k' 
      ) 
    ) 


pc = PatchCollection(patch_list, match_original=True) 
ax.add_collection(pc) 

ax.axis([-3, 480, -3, 480]) 
plt.show() 

На моей машине этот код занимает около 2,8 секунды, чтобы отобразить все.

enter image description here

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