Python 是否可以使用Get和Set操作matplotlib直方图中的数据?

Python 是否可以使用Get和Set操作matplotlib直方图中的数据?,python,matplotlib,histogram,matlab-figure,Python,Matplotlib,Histogram,Matlab Figure,我有一个使用matplotlib制作的堆叠直方图。当然,它有多个箱子(每个扇区上),每个箱子/条状物在子扇区中进一步分割(叠加直方图) 我想知道我怎样才能得到数据点,做一些数学计算(让我们假设每个箱子除以它的总价值),然后设置新的数据点 我期望它如何工作: import matplotlib.plt as plt ax = plt.subplt(111) h = ax.hist((subsector1,subsector2,subsector3), bins = 20, stacked=True

我有一个使用matplotlib制作的堆叠直方图。当然,它有多个箱子(每个扇区上),每个箱子/条状物在子扇区中进一步分割(叠加直方图)

我想知道我怎样才能得到数据点,做一些数学计算(让我们假设每个箱子除以它的总价值),然后设置新的数据点

我期望它如何工作:

import matplotlib.plt as plt
ax = plt.subplt(111)
h = ax.hist((subsector1,subsector2,subsector3), bins = 20, stacked=True)

y_data = h.get_yData
y_数据的形状类似于20 x 3(箱x子部门)

新的_y_数据的形状也将类似于20 x 3,但每个箱子上的总和将为1(或100%)

新的_h看起来更像一个条形图,具有相同大小的条形图,但每个条形图上的子扇区分布不同


这在python matplotlib中是否可行?

当您只需要值时,更容易使用它进行相同的计算,而无需绘制

当您有值时,可以直接绘制,而不需要

熊猫可能是另一种选择。请看一个类似于您的示例

下面是一些使用
np.histogram
plt.bar
的示例代码:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib.ticker导入百分比格式化程序
子部门1=np.clip(np.random.normal(70,20400),0100)
subsector2=np.clip(np.random.normal(50,20,1000),0,100)
subsector3=np.clip(np.random.normal(25,20500),0100)
数量=20
x_min=np.min(np.concatenate([第1子部门,第2子部门,第3子部门])
x_max=np.max(np.concatenate([第1子部门,第2子部门,第3子部门])
bounds=np.linspace(x_min,x_max,num_bin+1)
数值=np.零((数值,3))
就i而言,枚举中的分部((第1分部门、第2分部门、第3分部门)):
值[:,i],ux=np.直方图(子CT,bins=bounds)
使用np.errstate(divide='ignore',invalid='ignore'):
values/=values.sum(axis=1,keepdims=True)
图,ax=plt.子批次()
底部=0
对于范围(3)中的i:
plt.bar((边界[:-1]+边界[1:])/2,值[:,i],底部=底部,宽度=np.diff(边界)*0.8)
底部+=值[:,i]
plt.xlim(最小x_,最大x_)
plt.gca().yaxis.set\u major\u格式化程序(PercentFormatter(1.0))
plt.show()

这是否回答了您的问题?部分,因为它涵盖了问题的“获取”部分。我还需要将这些点(经过一些修改)添加到hist中。同时,我正在试着看看是否可以用结果构建一些条形图。一旦你有了所有的数据和样式,你就可以自己重新创建该图。这回答了我的问题(简短的回答是“否”),并提供了一个很好的替代解决方案。非常感谢。Matlotlib的plt.hist确实有一个stacked=选项。
new_y_data = y_data normalized by total on each bin
new_h = h.set_yData(new_y_data)