Построить список списков пикселей в вертикальной полосе, используя python - PullRequest
1 голос
/ 13 марта 2020

Это наносит на график одну полосу

values = random.sample(range(60, 100), 40)

width = 10
plt.imshow(np.repeat(values, width).reshape(-1, width), cmap='gray')

enter image description here

Как я могу изменить ее для отображения всех списков списков рядом друг с другом, вместо один список, такой как;

values_list = []
for x in range(10):
    values_list.append(random.sample(range(60, 100), 40))

Вот то, что я пробовал, но он отображает только последний в списке

for i in range(len(values_list)):

    plt.imshow(np.repeat(values_list[i], width).reshape(-1, width), cmap='gray')

plt.show()

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

enter image description here

1 Ответ

3 голосов
/ 13 марта 2020

Нет необходимости использовать np.repeat. Просто reshape(), чтобы изменить его на 2D-массив. Положение может быть установлено с помощью параметра imshow extent=. Чтобы получить правильные пределы x и y, они должны быть установлены явно. Настройка autoscale_on=False не позволяет imshow принять ограничения. origin='lower' устанавливает значения в value_list[i][0] внизу, чтобы ось y имела свое обычное направление.

В приведенном ниже коде используется подход из этого примера .

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

values_list = [random.sample(range(60, 100), 40) for x in range(10)]

fig, ax = plt.subplots()
width = 10
xlim = 0, width*len(values_list)
ylim = 0, max([len(v) for v in values_list]) + 2
ax.set(xlim=xlim, ylim=ylim, autoscale_on=False)
for i in range(len(values_list)):
    plt.imshow(np.array(values_list[i]).reshape(-1, 1), extent=[i * width, (i + 1) * width, 0, len(values_list[i])],
               origin='lower', cmap='inferno')
ax.set_aspect('auto')
plt.show()

example image

PS: Чтобы ось X имела нумерацию «столбцов», установите ширину в 1 и добавьте 0,5 к X-позициям. При желании расстояние между «столбцами» может быть установлено больше, чем их ширина, чтобы получить эффект гистограммы.

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

values_list = [random.sample(range(60, 100), random.randint(10,15)) for x in range(10)]

fig, ax = plt.subplots()
for i in range(len(values_list)):
    plt.imshow(np.array(values_list[i]).reshape(-1, 1), origin='lower',
               extent=[i + 0.6, i + 1.4, 0, len(values_list[i])], cmap='inferno')
ax.set_xticks(range(1, len(values_list) + 1))
xlim = 0.3, len(values_list) + 0.7
ylim = 0, max([len(v) for v in values_list]) + 2
ax.set(xlim=xlim, ylim=ylim)
ax.set_aspect('auto')
plt.show()

bar plot example

PS: чтобы иметь горизонтальные полосы, просто поменяйте местами все значения, относящиеся к x, к значениям, связанным с y. reshape(1, -1) потребуется, чтобы пиксели проходили слева направо.

for i in range(len(values_list)):
    plt.imshow(np.array(values_list[i]).reshape(1, -1), origin='lower',
               extent=[0, len(values_list[i]), i + 0.6, i + 1.4], cmap='RdYlBu')
ax.set_yticks(range(1, len(values_list) + 1))
ylim = 0.3, len(values_list) + 0.7
xlim = 0, max([len(v) for v in values_list]) + 2
ax.set(xlim=xlim, ylim=ylim)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...