首页 > 解决方案 > 如何使用matplotlib创建具有不同长度的多个数组的直方图,y轴上的百分比

问题描述

我想为多个数组创建直方图,它们将共享百分比 y 轴。

例如,此图正确:

import numpy as np
from matplotlib import pyplot as plt
import matplotlib.ticker as ticker

# these are my measurements, unsorted
num_of_points = 10000
num_of_bins = 20
data = np.random.randn(num_of_points) # generate random numbers from a gaussian distribution
fig, ax = plt.subplots()
ax.hist(data, bins=num_of_bins, edgecolor='black', alpha=0.3)
ax.set_title("Histogram")
ax.set_xlabel("X axis")
ax.set_ylabel("Percentage")
ax.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=len(data)))
plt.show()

图1

但是当我添加另一个长度不同的数据时,data2 的百分比关闭,因为 PercentFormatter 需要 len(data)。

num_of_points = 10000
num_of_points2 = 30000
num_of_bins = 20
data = np.random.randn(num_of_points) # generate random numbers from a gaussian distribution
data2 = np.random.randn(num_of_points2) 
fig, ax = plt.subplots()
ax.hist(data, bins=num_of_bins, edgecolor='black', alpha=0.3)
ax.hist(data2, bins=num_of_bins, edgecolor='black', alpha=0.3)
ax.set_title("Histogram")
ax.set_xlabel("X axis")
ax.set_ylabel("Percentage")
ax.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=len(data2)))
plt.show()

图 2

那么我怎样才能共享y轴百分比,这对于两个数据数组都是正确的?

标签: pythonmatplotlib

解决方案


我认为解决此问题的一种方法是使用辅助 y 轴绘制第二个数据。

尝试这个!

import numpy as np
from matplotlib import pyplot as plt
import matplotlib.ticker as ticker

# these are my measurements, unsorted
num_of_points = 10000
num_of_bins = 20
data = np.random.randn(num_of_points) # generate random numbers from a gaussian distribution
fig, ax = plt.subplots()
ax.hist(data, bins=num_of_bins, color='blue', edgecolor='black', alpha=0.1)
ax.set_title("Histogram")
ax.set_xlabel("X axis")
ax.set_ylabel("Percentage of data")
ax.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=len(data)))

ax1 = ax.twinx()
num_of_points2 = 30000
data2 = np.random.randn(num_of_points2) 
ax1.hist(data2, bins=num_of_bins, color='orange', edgecolor='black', alpha=0.1)
ax1.set_ylabel("Percentage of data2")
ax1.yaxis.set_major_formatter(ticker.PercentFormatter(xmax=len(data2)))
plt.show()


推荐阅读