在x轴上指定mathplotlib.pyplot直方图的值

时间:2019-03-25 16:28:17

标签: python matplotlib plot

给定一个数据集,我想在一个图中创建三个直方图。数据(只是一个巨大的数据集的一小段,可能会破坏模型):

x,         y1,        y2,      y3
2.0466115, 0,        0,        0
2.349824,  0,        0,        0
2.697959,  0,        0,        0
3.097671,  0.195374, 0.191008, 0.167979
3.5566025, 0.522926, 0.511492, 0.426324
4.083526,  0.691916, 0.6774083,0.5790586666666666
4.688515,  0.8181206,0.801901, 0.6795873333333334
5.3831355, 0.8489766,0.833376, 0.707486
6.1806665, 0.809022, 0.795524, 0.6750806666666667

我所有的x值都相同,y1y2y3代表三个不同的y值。我为每一列创建一个单独的列表,并将它们作为pyplot.hist的参数传递。您可以在这里看到我的代码:

import numpy as np
from matplotlib import pyplot
from excel_to_csv import coordinates

y1 = coordinates(1) #another method, which creates the list out of the column
y2 = coordinates(2)
y3 = coordinates(3)

bins = np.linspace(0, 10, 150)

pyplot.hist(y1, bins, alpha=0.5, label='y1')
pyplot.hist(y2, bins, alpha=0.5, label='y2')
pyplot.hist(y3, bins, alpha=0.5, label='y3')
pyplot.legend(loc='upper right')
pyplot.show()

此代码生成以下图(关于实际数据集): plot 据我研究,您为x轴范围创建了bins。但是,除了这样做,我想将我的x值放在这里。

我的目标是使直方图看起来像这样,但是作为直方图(再次,关于庞大的数据集): enter image description here

1 个答案:

答案 0 :(得分:0)

您可以使用np.histogram,然后绘制直方图的值:

import numpy as np
import matplotlib.pyplot as plt

# Generate sample data
y1 = np.random.normal(3,1,10000)
y2 = np.random.normal(5,1,10000)
y3 = np.random.normal(7,1,10000)

bins = np.linspace(0, 10, 150)

x = np.linspace(0,10000,149)

# Plot regular histograms
plt.figure()
plt.hist(y1, bins, alpha=0.5, label='y1')
plt.hist(y2, bins, alpha=0.5, label='y2')
plt.hist(y3, bins, alpha=0.5, label='y3')
plt.ylabel('Frequency')
plt.xlabel('Bins')
plt.legend(loc='upper right')
plt.show()

Histogram plot

# Compute histogram data
h1 = np.histogram(y1, bins)
h2 = np.histogram(y2, bins)
h3 = np.histogram(y3, bins)

# Compute bin average
bin_avg = bins[0:-1] + bins[1] - bins[0]

# Plot histogram data as a line with markers
plt.figure()
plt.plot(bin_avg, h1[0], alpha=0.5, label='y1', marker='o')
plt.plot(bin_avg, h2[0], alpha=0.5, label='y2', marker='o')
plt.plot(bin_avg, h3[0], alpha=0.5, label='y3', marker='o')
plt.ylabel('Frequency')
plt.xlabel('Bins')
plt.legend(loc='upper right')
plt.show()

Line plot with markers

将合并后的数据与x作图是没有意义的,因为一旦数据被直方图转换,与x的关系就不再相同。