Как создать гистограмму со списком ниже? - PullRequest
0 голосов
/ 19 июня 2020

Как создать гистограмму со списком ниже?

[[0, 0, 0, 19, 7], [0, 0, 0, 21, 7], [0, 0, 0, 21, 7], [0, 0, 0, 29, 0]]

Объяснение списка: [0, 0, 0, 19, 7]

  • Первое значение = среднее значение повторения между 0-20
  • Второе значение = среднее значение повторения между 20-40
  • Третье значение = среднее значение повторения между 40-60
  • Четвертое значение = среднее количество повторений между 60-80
  • Пятое значение = среднее количество повторений между 80-100

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

Чего я достиг на данный момент:

result = [[[0, 0, 0, 19, 7], [0, 0, 0, 21, 7], [0, 0, 0, 21, 7], [0, 0, 0, 29, 0]]]
fig, ax = plt.subplots(figsize=(10,6))
for i in range(len(result)):
    data = np.array(result[i])
    x=np.arange(len(data)) + i*6
    # draw means
    ax.bar(x-0.2, data[:,0], color='blue', width=0.4)
    ax.bar(x+0.2, data[:,1], color='green', width=0.4)
    ax.bar(x-0.2, data[:,2], color='yellow', width=0.4)
    ax.bar(x+0.2, data[:,3], color='orange', width=0.4)
    ax.bar(x+0.2, data[:,4], color='red', width=0.4)
# separation line
ax.axvline(4.75)
# turn off xticks
ax.set_xticks([])
ax.legend(labels=['0-20', '20-40', '40-60', '60-80', '80-100'])
leg = ax.get_legend()
leg.legendHandles[0].set_color('blue')
leg.legendHandles[1].set_color('green')
leg.legendHandles[2].set_color('yellow')
leg.legendHandles[3].set_color('orange')
leg.legendHandles[4].set_color('red')
plt.title("Histogram")
plt.ylabel('Consume')
plt.xlabel('Percent')
plt.show()

Есть предложения?

1 Ответ

1 голос
/ 19 июня 2020

Вот как можно нарисовать описанный сюжет. Обратите внимание, что обычно matplotlib устанавливает только одну запись легенды для полной гистограммы. Чтобы иметь запись для отдельных столбцов, необходимо явно задать метку для каждого из них. В приведенном ниже коде такая метка добавляется к каждой панели в первом наборе.

(Обратите внимание, что я оставил одну квадратную скобку для result, поскольку в исходном сообщении это трехмерный список. Если такой 3D-список может потребоваться, вы можете написать l oop как for i, data in enumerate(result[0])).

import numpy as np
import matplotlib.pyplot as plt

result = [[0, 0, 0, 19, 7], [0, 0, 0, 21, 7], [0, 0, 0, 21, 7], [0, 0, 0, 29, 0]]
colors = ['blue', 'green', 'yellow', 'orange', 'red']
labels = ['0-20', '20-40', '40-60', '60-80', '80-100']
fig, ax = plt.subplots(figsize=(10, 6))
for i, data in enumerate(result):
    x = np.arange(len(data)) + i*6
    bars = ax.bar(x, data, color=colors, width=0.4)
    if i == 0:
        for bar, label in zip(bars, labels):
            bar.set_label(label)
    if i < len(result) - 1:
        # separation line after each part, but not after the last
        ax.axvline(4.75 + i*6, color='black', linestyle=':')
ax.set_xticks([])
ax.legend()
ax.set_title("Histogram")
ax.set_ylabel('Consume')
ax.set_xlabel('Percent')
plt.show()

resulting plot

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