我有一个小功能,可以生成两个子图的图。一个子图是两个直方图重叠,另一个子图是将一个直方图除以另一个直方图的结果。
对于第二个子图,我不知道如何去除直方图条之间的边缘(如上面的那个)并且我不知道如何减小其高度(例如,它是,例如,高度的一半)它上面的一个)。我也不确定如何将标题设置为情节的最顶端。
这些事情怎么可能完成?
我的代码如下:
import numpy
import matplotlib.pyplot
import datavision # sudo pip install datavision
import shijian # sudo pip install shijian
def main():
a = numpy.random.normal(2, 2, size = 120)
b = numpy.random.normal(2, 2, size = 120)
save_histogram_comparison_matplotlib(
values_1 = a,
values_2 = b,
label_1 = "a",
label_2 = "b",
normalize = True,
label_ratio_x = "frequency",
label_y = "",
title = "comparison of a and b",
filename = "test.png"
)
def save_histogram_comparison_matplotlib(
values_1 = None,
values_2 = None,
filename = None,
number_of_bins = None,
normalize = True,
label_x = "",
label_y = None,
label_ratio_x = "frequency",
label_ratio_y = "ratio",
title = None,
label_1 = "1",
label_2 = "2",
overwrite = True,
LaTeX = False
):
matplotlib.pyplot.ioff()
if LaTeX is True:
matplotlib.pyplot.rc("text", usetex = True)
matplotlib.pyplot.rc("font", family = "serif")
if number_of_bins is None:
number_of_bins_1 = datavision.propose_number_of_bins(values_1)
number_of_bins_2 = datavision.propose_number_of_bins(values_2)
number_of_bins = int((number_of_bins_1 + number_of_bins_2) / 2)
if filename is None:
filename = shijian.propose_filename(
filename = title.replace(" ", "_") + ".png",
overwrite = overwrite
)
values = []
values.append(values_1)
values.append(values_2)
bar_width = 0.8
figure, (axis_1, axis_2) = matplotlib.pyplot.subplots(nrows = 2)
ns, bins, patches = axis_1.hist(
values,
normed = normalize,
histtype = "stepfilled",
bins = number_of_bins,
alpha = 0.5,
label = [label_1, label_2],
rwidth = bar_width,
linewidth = 0
)
axis_1.legend()
axis_2.bar(
bins[:-1],
ns[0] / ns[1],
edgecolor = "#ffffff", # "none"
alpha = 1,
width = bins[1] - bins[0]
)
axis_1.set_xlabel(label_x)
axis_1.set_ylabel(label_y)
axis_2.set_xlabel(label_ratio_x)
axis_2.set_ylabel(label_ratio_y)
matplotlib.pyplot.title(title)
matplotlib.pyplot.savefig(filename)
matplotlib.pyplot.close()
if __name__ == "__main__":
main()
答案 0 :(得分:1)
您有3个问题:
在这里,您可以将linewidth
设置为0以调用bar
:
axis_2.bar(
bins[:-1],
ns[0] / ns[1],
linewidth=0,
alpha = 1,
width = bins[1] - bins[0]
)
在这里,我们可以在创建子图时将kwargs发送到gridspec
。相关选项为height_ratios
。我们使用gridspec_kw
选项将其发送给subplots
。如果我们将它设置为(2,1),那么第一个子图是第二个子图的高度的两倍。
figure, (axis_1, axis_2) = matplotlib.pyplot.subplots(
nrows = 2,
gridspec_kw={'height_ratios':(2,1)}
)
当您致电matplotlib.pyplot.title(title)
时,实际上是设置了当前活动的子绘图轴的标题,在本例中为axis_2
。要设置整体数字的标题,您可以设置suptitle
:
matplotlib.pyplot.suptitle(title)
或者,由于您已经为您的人物命名,因此您可以使用:
figure.suptitle(title)
同样,你可以使用:
figure.savefig(filename)
保存一些按键。
全部放在一起: