Моя программа берет n
наборов данных и составляет их гистограммы.
I.Как обозначить вертикальные линии независимо от высоты графика?
Вертикальная линия указывает на наиболее частое значение в наборе данных.Я хочу добавить метку с указанием значения, скажем, 20% сверху.При использовании matplotlib.pyplot.text()
мне пришлось вручную присваивать значения x
и y
. В зависимости от набора данных текст идет вверх или вниз, чего я не хочу.
matplot.axvline(most_common_number, linewidth=0.5, color='black')
matplot.text(most_common_number + 3, 10, str(most_common_number),
horizontalalignment='center', fontweight='bold', color='black')
Я также попытался установить параметр label
для matplotlib.pyplot.axvline()
но это только добавляет к legend
сюжета.
matplot.axvline(most_common_number, linewidth=0.5, color='black', label=str(most_common_number))
Интересно, есть лиэто способ использовать проценты, поэтому текст появляется сверху n%
или использовать другой метод для обозначения вертикальных линий.Или я все делаю неправильно?
II.Как сделать так, чтобы отметки на оси x были лучше распределены на результирующем изображении?
Я хочу, чтобы отметки на оси x были в 16 раз, поэтому мне пришлось переопределить значения по умолчанию.Вот тут и начались неприятности.Когда я сохраняю график в файл PNG, ось X выглядит действительно испорченной.
Но когда я использую show()
, она работает нормально:
Фрагмент программы
kwargs = dict(alpha=0.5, bins=37, range=(0, 304), density=False, stacked=True)
fig, ax1 = matplot.subplots()
colors = ['tab:blue', 'tab:orange', 'tab:green', 'tab:red', 'tab:purple', 'tab:brown', 'tab:pink', 'tab:gray', 'tab:olive', 'tab:cyan']
count = 0
'''
datasets = [('dataset name', ['data'])]
'''
for item in datasets:
dataset = item[1]
most_common_number = most_common(dataset)
ax1.hist(dataset, **kwargs, label=item[0], color=colors[count])
matplot.axvline(most_common_number, linewidth=0.5, color='black')
matplot.text(most_common_number + 3, 10, str(most_common_number),
horizontalalignment='center', fontweight='bold', color='black')
count += 1
#for x-axis
loc = matplotticker.MultipleLocator(base=16) # this locator puts ticks at regular intervals
ax1.xaxis.set_major_locator(loc)
#for y-axis
y_vals = ax1.get_yticks()
ax1.set_yticklabels(['{:3.1f}%'.format(x / len(datasets[0][1]) * 100) for x in y_vals])
#set title
matplot.gca().set(title='1 vs 2 vs 3')
#set subtitle
matplot.suptitle("This is a cool subtitle.", va="bottom", family="overpass")
matplot.legend()
fig = matplot.gcf()
fig.set_size_inches(16, 9)
matplot.savefig('out.png', format = 'png', dpi=120)
matplot.show()