简体   繁体   English

Plot 多个直方图作为网格

[英]Plot multiple histograms as a grid

I am trying to plot multiple histograms on the same window using a list of tuples.我正在尝试使用元组列表在同一个 window 上 plot 多个直方图。 I have managed to get it to sketch only 1 tuple at a time and I just can't seem to get it to work with all of them.我设法让它一次只绘制 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()

As you can see from the above code, I can plot one tuple at a time say q1,q2 etc but how do I generalise it so that it plots all of them.正如您从上面的代码中看到的那样,我可以一次使用 plot 一个元组说 q1、q2 等,但是我如何对其进行概括以便绘制所有这些元组。

I've tried to mimic this python plot multiple histograms , which is exactly what I want however I had no luck.我试图模仿这个python plot 多个直方图,这正是我想要的,但是我没有运气。

Thank you for your time:)感谢您的时间:)

You need to define a grid of axes with plt.subplots taking into account the amount of tuples in the list, and how many you want per row.您需要使用plt.subplots定义一个轴网格,同时考虑到列表中的元组数量以及每行需要多少个。 Then iterate over the returned axes, and plot the histograms in the corresponding axis.然后遍历返回的轴,plot 对应轴的直方图。 You could use Axes.hist , but I've always preferred to use ax.bar , from the result of np.unique , which also can return the counts of unique values:您可以使用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()

在此处输入图像描述

You can customise the above to whatever amount of rows/cols you prefer, for 3 rows for instance:您可以将上述内容自定义为您喜欢的任意数量的行/列,例如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()

在此处输入图像描述

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM