Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在matplotlob直方图(Python)中标记存储箱_Python_Matplotlib_Histogram - Fatal编程技术网

如何在matplotlob直方图(Python)中标记存储箱

如何在matplotlob直方图(Python)中标记存储箱,python,matplotlib,histogram,Python,Matplotlib,Histogram,我想画一个财务数据的柱状图。具体来说,我想绘制一个指数回报的直方图,其中回报在x轴上,数字计数在y轴上 我使用了以下代码: import pandas as pd import numpy as np import matplotlib.pyplot as plt returns = (0.08,0.05,-0.15,0.12,-0.18,0.02,0.25) years = (2010,2011,2012,2013,2014,2015,2016) data = pd.DataFrame(re

我想画一个财务数据的柱状图。具体来说,我想绘制一个指数回报的直方图,其中回报在x轴上,数字计数在y轴上

我使用了以下代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

returns = (0.08,0.05,-0.15,0.12,-0.18,0.02,0.25)
years = (2010,2011,2012,2013,2014,2015,2016)
data = pd.DataFrame(returns, columns = ["Return"], index = years)
bins = [-0.3, -0.2, -0.1, 0, 0.1, 0.2, 0.3, 0.4, 0.5]

plt.hist(data, bins = bins, edgecolor = "white")

这段代码生成以下曲线图。 当我现在查看收益率介于-20%和-10%之间的数据时,有2年属于这一范围(2012年和2014年)。 我现在想做的基本上是,包含这两个观测值的箱子,在-20%和-10%之间,被分成两个箱子,它们彼此叠在一起,但是观测年份显示在箱子里面。 这样我可以在查看地块时看到垃圾桶对应的两个年份。 但是我在文档中找不到任何提示如何做到这一点。

您可以用它来告诉每个值属于哪个bin。然后,您可以迭代数据帧的行,并每年在所需位置绘制。每个步骤都需要更新具有底部位置的阵列

由于
np.digitalize
1
开始计算箱子,并使用
0
对太小的值进行计算,需要减去
1
,作为数组中的索引。此外,大于最大值的值将获得过高的bin索引,因此也可以将其过滤掉

导入matplotlib.pyplot作为plt
从matplotlib.ticker导入MultipleLocator
作为pd进口熊猫
将numpy作为np导入
收益率=(0.08,0.05,-0.15,0.12,-0.18,0.02,0.25)
年份=(2010、2011、2012、2013、2014、2015、2016)
data=pd.DataFrame(返回,列=['Return'],索引=years)
垃圾箱=[-0.3,-0.2,-0.1,0,0.1,0.2,0.3,0.4,0.5]
料仓宽度=np.差异(料仓)
数据['Bin_ind']=np。数字化(数据['Return',bins)-1#np。数字化使用0表示小于最小Bin边的值
图,ax=plt.子批次()
底部=np.零(透镜(箱))
对于年份,数据中的bin_ind['bin_ind']。iteritems():
如果bin_ind>=0且bin_ind

该方法可以扩展到根据返回值对每个矩形进行颜色编码,例如:

cmap=plt.cm.get\u cmap('coolwarm\u r'))
标准=plt.标准化(-0.5,0.5)
图,ax=plt.子批次()
底部=np.零(透镜(箱))
对于年份,数据中的bin_ind['bin_ind']。iteritems():
ax.bar(x=料仓[bin\u ind],高度=1,底部=底部[bin\u ind],宽度=料仓宽度[bin\u ind],对齐=边缘',
facecolor=cmap(norm(data.loc[year,'Return']),edgecolor='black')
ax.text(桶[bin_ind]+桶宽[bin_ind]/2,底部[bin_ind]+0.5,年份,ha='center',va='center')
底部[bin_ind]+=1

这是否回答了您的问题?请(例如在油漆中)绘制一些简单的预期结果图。这将更容易理解你想要什么achieve@dankal444下面的图是我想要达到的结果。但有一个问题是,有几个盒子不在它们所属的正确范围内,这与我的预期非常接近!剩下的唯一问题是箱子在离右边很远的地方有一个箱子。例如,2011年和2015年的回报率分别为0.05和0.02,但图中的方框介于0.1和0.2之间。因此,它们太偏右了,我不知道如何解决这个问题。我基本上需要将整个绘图框移到右边。谢谢你检查并让我知道。我忘了
np。Digitalize
从1开始给垃圾箱编号。我相应地更新了这个帖子。如果你的问题现在被回答了,请考虑接受的答案。