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