Создание графика цветовой карты в pyplot со случайными данными и позициями - PullRequest
0 голосов
/ 10 апреля 2020

Я хочу построить карту (назовем ее testmap) формы (100,3) с картой цветов. Каждая строка состоит из x-позиции, y-позиции и данных, нарисованных случайным образом.

map_pos_x = np.random.randint(100, size=100)
map_pos_y = np.random.randint(100, size=100)
map_pos = np.stack((map_pos_x, map_pos_y), axis=-1)
draw = np.random.random(100)
draw = np.reshape(draw, (100,1))
testmap = np.hstack((map_pos, draw))

Я не хочу использовать диаграмму рассеяния, поскольку предполагается, что положения карты эмулируют пиксели камеры. Если я попробую что-то вроде

plt.matshow(A=testmap)

, я получу карту 100 * 2. Тем не менее, я хочу карту 100 * 100. Позиции без данных могут быть черными. Как я могу это сделать?

edit: теперь я принял следующее:

grid = np.zeros((100, 100))
i=0

for pixel in map_pos:
    grid[pixel[0], pixel[1]] = draw[i]
    i=i+1

Это дает то, что я хочу получить. Причина, по которой я не рисую случайные числа в самом l oop, а перебираю существующий массив "draw", заключается в том, что сначала отрисовываются числа, которые рисуются, поэтому я хочу иметь свободу манипулировать «рисовать» независимо от l oop. Этот код также создает двойные записи / неуникальные пары, что само по себе хорошо, но я хотел бы идентифицировать эти двойные пары и добавить «рисование» для этих пар. Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 10 апреля 2020

Вы можете сначала создать пустые пиксели, либо с нулями (получает «самый низкий» цвет), либо с NaN (эти пиксели будут невидимыми). Затем вы можете использовать интеллектуальную индексацию numpy для заполнения значений. Чтобы это работало, важно, чтобы map_pos_x и map_pos_y были целочисленными координатами в правильном диапазоне.

import numpy as np
import matplotlib.pyplot as plt

map_pos_x = np.random.randint(100, size=100)
map_pos_y = np.random.randint(100, size=100)
draw = np.random.random(100)

# testmap = np.full((100,100), np.nan)
testmap = np.zeros((100,100))
testmap[map_pos_x, map_pos_y] = draw

plt.matshow(testmap)
plt.show()

first plot

PS : О вашем новом вопросе, чтобы посчитать, сколько позиций xy совпадают, можно использовать np.histogram2d. Результат также можно построить с помощью matshow. Преимущество состоит в том, что значения xy не обязательно должны быть целыми числами: они будут суммироваться в зависимости от их округленных значений.

Если каждая позиция xy также имеет значение, такое как массив draw в вопросе , это может быть передано как np.histogram2d(...., weights=draw).

import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1234)

N = 100
map_pos_x = np.random.randint(N, size=10000)
map_pos_y = np.random.randint(N, size=len(map_pos_x))

fig, (ax1, ax2) = plt.subplots(ncols=2)

testmap1, xedges, yedges = np.histogram2d(map_pos_x, map_pos_y, bins=N, range=[[0, N - 1], [0, N - 1]])

ax1.matshow(testmap1)

plt.show()

Чтобы показать, что происходит, вот тест с N=10 с matshow слева. Справа - точечная диаграмма с полупрозрачными точками, которая делает их темнее, когда совпадают другие точки.

second plot

0 голосов
/ 10 апреля 2020

решение таково:

import numpy as np
import matplotlib.pyplot as plt
import random
import itertools

#gets as input the size of the axis and the number of pairs  
def get_random_pairs(axis_range, count):
  numbers = [i for i in range(0,axis_range)]
  pairs = list(itertools.product(numbers,repeat=2))
  return random.choices(pairs, k=count)

object_positions = get_random_pairs(100,100) 

grid = np.zeros((100, 100))

for pixel in object_positions:
    grid[pixel[0],pixel[1]] = np.random.random()
    print(pixel)

plt.matshow(A=grid)

результат: enter image description here

edit: так как сетка инициализируется нулем, просто добавьте новое значение в старый

n_pixels_x = 100
n_pixels_y = 100 
map_pos_x = np.random.randint(100, size=100)
map_pos_y = np.random.randint(100, size=100)
map_pos = np.stack((map_pos_x, map_pos_y), axis=-1)
draw = np.random.random(100)
draw = np.reshape(draw, (100,1))
testmap = np.hstack((map_pos, draw))
grid = np.zeros((n_pixels_x, n_pixels_y))


for pixel in map_pos:
    grid[pixel[0], pixel[1]] = grid[pixel[0], pixel[1]] + draw[i]


plt.matshow(A=grid)
...