Как решить проблему краев в гексагональной сюжет? - PullRequest
0 голосов
/ 24 июня 2018

Я новичок и надеюсь разобраться в проблеме.

Я создал такую ​​матрицу:

 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 6 8 9 1 0 0]
 [0 0 4 6 5 4 0 0]
 [0 0 4 2 8 9 0 0]
 [0 0 1 3 6 7 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]

Дело в том, что мне нужно создать гексагональный график, в котором цветовая шкала представляет случайные числа в отдельных ячейках. Вот что я сделал:

import numpy as np
import matplotlib.pyplot as plt 
n=4

A=np.zeros([2*n,2*n], dtype=int)
B=np.random.randint(1,10, size=(n,n))

A[2:6,2:6]=B


plt.figure(figsize=(5,5))
plt.imshow(A, origin=['lower'], cmap=plt.cm.Purples_r)
plt.colorbar()


x=[]
y=[]
for i in range (np.shape(A)[0]):
    for j in range (np.shape(A)[1]):
        N_occurence=A[i,j]
        print(N_occurence)
        for k in range (N_occurence):
            x=np.append(x, i)
            y=np.append(y, j)

plt.figure(figsize=(5,5))
plt.hexbin(x,y,gridsize=(10), cmap=plt.cm.Purples_r)
plt.xlim([1, 6])
plt.ylim([1, 6])
plt.colorbar()

plt.show()

но я не могу решить проблему краев, я всегда получаю половину шестиугольников и сюжет не точен. Кто-нибудь знает более простой способ или подобный пример?

1 Ответ

0 голосов
/ 24 июня 2018

Я все еще не совсем уверен, что вы ищете, но я думаю, вы хотите иметь imshow сюжет, который использует шестиугольники, такие как hexbin?

Может быть, это немного помогает:

import matplotlib.pyplot as plt
import numpy as np

# Generate array
A = np.zeros([8, 8], dtype=int)
A[2:6, 2:6] = np.random.randint(1, 10, size=(4, 4))

# Print array
print(A)

# `imshow` plot
plt.figure(figsize=(5,5))
plt.imshow(A, extent=(0, 8, 0, 8), origin='lower')
plt.colorbar()

# Rewrite array to get x and y values
# TODO: There has to be a better way than to use two `for` loops
X = []
Y = []
for y in range(len(A)):
    for x, n in enumerate(A[len(A)-y-1]):
        X += [x]*n
        Y += [y]*n

# `scatter` plot to visualize rewritten array data
plt.figure(figsize=(5,5))
plt.scatter(X, Y)

# `hexbin` plot
plt.figure(figsize=(5,5))
plt.hexbin(X, Y, gridsize=5, extent=(0, 7, 0, 7))
plt.colorbar()

# show plots
plt.show()

Какие результаты для случайного массива A

[[0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 3 7 3 3 0 0]
 [0 0 3 5 8 1 0 0]
 [0 0 4 8 7 3 0 0]
 [0 0 1 7 9 3 0 0]
 [0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0]]

в

imshow imshow

scatter scatter

hexbin hexbin

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

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