Как обозначить вертикальные линии независимо от масштаба графика? - PullRequest
0 голосов
/ 20 сентября 2019

Моя программа берет 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))

enter image description here

Интересно, есть лиэто способ использовать проценты, поэтому текст появляется сверху n% или использовать другой метод для обозначения вертикальных линий.Или я все делаю неправильно?

II.Как сделать так, чтобы отметки на оси x были лучше распределены на результирующем изображении?

Я хочу, чтобы отметки на оси x были в 16 раз, поэтому мне пришлось переопределить значения по умолчанию.Вот тут и начались неприятности.Когда я сохраняю график в файл PNG, ось X выглядит действительно испорченной.

The ticks on the x-axis need to be spaced out better

Но когда я использую show(), она работает нормально: enter image description here

Фрагмент программы

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()

1 Ответ

0 голосов
/ 20 сентября 2019

I.Как обозначить вертикальные линии независимо от высоты графика?

Это можно сделать двумя способами:

Пределы осей

matplotlib.pyplot.xlim и matplotlib.pyplot.ylim

ylim() даст максимальные и минимальные значения оси.Например: (0.0, 1707.3)

matplot.text(x + matplot.xlim()[1] * 0.02 , matplot.ylim()[1] * 0.8,
        str(most_common_number),,
        horizontalalignment='center', fontweight='bold', color='black')

(x + matplot.xlim()[1] * 0.02 означает при x, но 2% вправо.Потому что вы не хотите, чтобы текст совпадал с вертикальной линией, которую он помечает.

matplot.ylim()[1] * 0.8 означает на 80% высоту оси Y.

Или вы можете напрямую указать x и y в качестве шкалы (например, 0,8 оси), используя transform параметр:

matplot.text(most_common_number, 0.8,
    '        ' + str(most_common_number), transform=ax1.get_xaxis_transform(),
    horizontalalignment='center', fontweight='bold', color='black')

Здесь y = 0.8 означает на 80% высоту оси Y.

II.Как сделать так, чтобы отметки по оси x были лучше распределены на полученном изображении?

Используйте matplotlib.pyplot.gcf(), чтобы изменить размеры, и используйте пользовательский dpi (в противном случае текст не будет масштабироваться должным образом) при сохранении.цифра.

gcf() означает « получить текущую цифру ».

fig = matplot.gcf()
fig.set_size_inches(16, 9)
matplot.savefig('out.png', format = 'png', dpi=120)

Таким образом, полученное изображение будет (16 * 120, 9 * 120) или (1920, 1080) пикселей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...