Нет необходимости использовать 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](https://i.stack.imgur.com/4uEBh.png)
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](https://i.stack.imgur.com/1Xeh4.png)
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)