从指定的 x/y 值填充直方图
我有一个直方图的图像:
我知道很多人会推荐我使用matplotlib库和其他资源,但不知为什么,我想的和从不同来源读到的内容在我的直方图上并不太适用。(如果我错了,请纠正我!)
我的问题是:
我该如何在直方图上填充斜线,这些斜线是根据在(2,2,1)和(2,2,4)图中叠加的线的位置来划分的。
x轴的直方图(位置2,2,1)上有一条竖线,位置在x = -0.222
,而y轴的直方图上有一条横线,位置在y = 0.49
。
以下是一个修改过的示例代码,可以用于任何数组:
import numpy as np
import scipy
import matplotlib as mpl
import matplotlib.pyplot as plt
import pylab
X = 0.32, 0.41, 0.45, 0.53, -0.23, 0.34, 0.35, 0.47, 0.48, 0.33, 0.49, -0.10, -0.23, 0.45, 0.19
Y = 0.56, 0.67, 0.49, 0.61, 0.00, -0.02, -0.12, 0.12, 0.23, 0.44, 0.56, 0.13, 0.56, 0.67, 0.28
binsize = 0.1
min_x_data, max_x_data = np.min(X), np.max(X)
num_x_bins = np.floor((max_x_data - min_x_data) / binsize)
min_y_data, max_y_data = np.min(Y), np.max(Y)
num_y_bins = np.floor((max_y_data - min_y_data) / bin size)
fig = plt.figure(221)
axScatter = fig.add_subplot(223)
axScatter.scatter(X, Y)
axScatter.set_xlim(-2.0, 1.5)
axScatter.set_ylim(-2.0, 2.5)
axHistX = fig.add_subplot(221)
axHistX.set_xlim(-2.0, 1.5)
axHistX.set_ylim(0, 10)
axHistY = fig.add_subplot(224)
axHistY.set_xlim(0, 10)
axHistY.set_ylim(-2.0, 2.5)
axHistX.hist(X, num_x_bins, ec='0.3', fc='none', histtype='step')
axHistY.hist(Y, num_y_bins, ec='0.3', fc='none', histtype='step', orientation='horizontal')
axScatter.axhline(y=0.49, xmin=0, xmax=1, linestyle='-.',c='k')
axScatter.axvline(x=-0.222, ymin=0, ymax=1, linestyle='-.',c='k')
axHistX.axvline(x=-0.222, ymin=0, ymax=1, linestyle='-.',c='k')
axHistY.axhline(y=0.49, xmin=0, xmax=1, linestyle='-.',c='k')
plt.show()
1 个回答
6
这是我最后一次尝试,但我强烈建议你先学习一下Python和matplotlib的基础知识。
def step_hist(ax, X, num_x_bins=10,
hatch_from= -2, hatch_till=0.5,
orientation='h'):
#make histogram by hand.
hist, edges = np.histogram(X, bins=num_x_bins)
#generate (x,y) points for a step-plot
edges = np.repeat(edges, 2)
hist = np.hstack((0, np.repeat(hist, 2), 0))
#plot step_hist
#indices where we want the plot hatached
fill_region =(hatch_from<edges)&(edges<hatch_till)
#apply hatching my using fill_between.
if orientation == 'h':
ax.fill_between(edges[fill_region],
hist[fill_region], 0,
color='none', edgecolor='k',
hatch='xxx')
ax.plot(edges, hist, 'k')
elif orientation == 'v':
ax.fill_betweenx(edges[fill_region],
hist[fill_region], 0,
color='none', edgecolor='k',
hatch='xxx')
ax.plot(hist, edges, 'k')
a, b = np.random.randn(500), np.random.randn(500)
ax_top = plt.subplot(221)
ax_right = plt.subplot(224)
ax_cent = plt.subplot(223)
ax_cent.scatter(a, b, c='k')
step_hist(ax_top, a)
step_hist(ax_right, a, orientation='v')