Построить несколько гистограмм в виде сетки - PullRequest
1 голос
/ 05 апреля 2020

Я пытаюсь построить несколько гистограмм в одном окне, используя список кортежей. Мне удалось заставить его набросать только 1 кортеж за раз, и я просто не могу заставить его работать со всеми из них.

import numpy as np
import matplotlib.pyplot as plt

a = [(1, 2, 0, 0, 0, 3, 3, 1, 2, 2), (0, 2, 3, 3, 0, 1, 1, 1, 2, 2), (1, 2, 0, 3, 0, 1, 2, 1, 2, 2),(2, 0, 0, 3, 3, 1, 2, 1, 2, 2),(3,1,2,3,0,0,1,2,3,1)] #my list of tuples

q1,q2,q3,q4,q5,q6,q7,q8,q9,q10 = zip(*a) #split into [(1,0,1,2,3) ,(2,2,2,0,1),..etc] where q1=(1,0,1,2,3)

labels, counts = np.unique(q1,return_counts=True) #labels = 0,1,2,3 and counts the occurence of 0,1,2,3

ticks = range(len(counts))
plt.bar(ticks,counts, align='center')
plt.xticks(ticks, labels)
plt.show()

Как видно из приведенного выше кода, я можно построить один кортеж за раз, скажем, q1, q2 и т. д. c, но как мне обобщить его так, чтобы он отображал их все.

Я пытался имитировать c это python построить несколько гистограмм , что именно то, что я хочу, однако мне не повезло.

Спасибо, что уделили время:)

1 Ответ

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

Вам необходимо определить сетку осей с помощью plt.subplots с учетом количества кортежей в списке и количества, которое вы хотите на строку. Затем выполните итерацию по возвращенным осям и нанесите гистограммы на соответствующую ось. Вы можете использовать Axes.hist , но я всегда предпочитал использовать ax.bar из результата np.unique, который также может возвращать количество уникальных значений:

from matplotlib import pyplot as plt
import numpy as np

l = list(zip(*a))
n_cols = 2
fig, axes = plt.subplots(nrows=int(np.ceil(len(l)/n_cols)), 
                         ncols=n_cols, 
                         figsize=(15,15))

for i, (t, ax) in enumerate(zip(l, axes.flatten())):
    labels, counts = np.unique(t, return_counts=True)
    ax.bar(labels, counts, align='center', color='blue', alpha=.3)
    ax.title.set_text(f'Tuple {i}')

plt.tight_layout()  
plt.show()

enter image description here

Вы можете настроить вышеуказанное на любое количество строк / столбцов, которое вы предпочитаете, например, для 3 строк:

l = list(zip(*a))
n_cols = 3
fig, axes = plt.subplots(nrows=int(np.ceil(len(l)/n_cols)), 
                         ncols=n_cols, 
                         figsize=(15,15))

for i, (t, ax) in enumerate(zip(l, axes.flatten())):
    labels, counts = np.unique(t, return_counts=True)
    ax.bar(labels, counts, align='center', color='blue', alpha=.3)
    ax.title.set_text(f'Tuple {i}')

plt.tight_layout()  
plt.show()

enter image description here

...