标记堆叠直方图箱,频率仅为其中一个堆栈

时间:2016-02-05 19:22:59

标签: python matplotlib

我已经制作了一些数据的直方图。它代表了一堆恒星,其中一些已被观察到,其他的则没有。白色空间代表未观察到的空白区域。我想这样做,以便在有空白区域的垃圾箱上面,它会标记这些垃圾箱中的白色数量,但忽略绿色和橙色。如果上面的箱子很复杂,那么它们下面也很好。无论哪里最简单。这是情节和代码:

Plot

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
from matplotlib import font_manager

# hfont = {'fontname':'Computer Modern'}

filename = ("master.kkids.obslist")

datadata = np.loadtxt(filename,skiprows=14,dtype=str)

x = datadata[:,7]
y = datadata[:,8]
u = datadata[:,18]
v = datadata[:,19]
z = datadata[:,20]

yesGEM = (v == "Y") & (u == "GemN")
yesDCT = (v == "Y") & (u == "DCT")
no = (v == "N")

x1 = x.astype(float)
y1 = y.astype(float)
x2 = x1*24/360

colors = ['green', 'orange', 'white']
labels = ['GemN','DCT','Not Observed']

plt.xlim(0,24)

plt.hist((x2[yesGEM],x2[yesDCT],x2[no]), 24, label=labels, color=colors, histtype='bar', stacked=True)

plt.legend(fancybox=True,shadow=True)

plt.ylabel('Frequency')
plt.xlabel('Right Ascension (h)')

plt.savefig('kkids.hist.png')

1 个答案:

答案 0 :(得分:1)

一般模式可以在x轴上循环,对于每个堆栈检查是否存在“未观察”,如果是,则获取GemN + DCT的值+(Not Observed / 2)对于此观察,然后使用这两个值作为x和y,使用plt.text(x, y, text)绘制所需文本(即未观察到的值)。

因此,如果您正确理解您的数据集,我想这样的事情应该可以完成这项工作:

# Get the returned arrays from plt.hist, they contain stacked frequencies
phist = plt.hist((x2[yesGEM],x2[yesDCT],x2[no]), 24, label=labels,
                 color=colors, histtype='bar', stacked=True)
plt.legend(fancybox=True,shadow=True)
plt.ylabel('Frequency')
plt.xlabel('Right Ascension (h)')
# Reshape the frequencies values :
stack_plots = \
    np.concatenate(phist[0]).reshape(len(labels), len(phist[0][0])).T

for nb_x, stack in enumerate(stack_plots):
    # 'stack' is an array with the frequency of [GEM, DCT + GEM, CDT + GEM + NO]
    if stack[2] - stack[1] != 0: # If there is Not Observed..
        # Compute the coords for the text :
        x_text = nb_x
        y_text = stack[1] + (stack[2] - stack[1]) / 2
        # And plot it:
        plt.text(x_text, y_text, round(stack[2] - stack[1]), verticalalignment='center')