Как обеспечить равномерный интервал между метками на оси x графика matplotlib? - PullRequest
0 голосов
/ 05 марта 2019

Мне дали данные, для которых мне нужно найти histogram.Поэтому я использовал функцию панд hist() и построил график с помощью matplotlib.Код выполняется на удаленном сервере, поэтому я не могу его увидеть напрямую, и, следовательно, я сохраняю изображение.Вот как выглядит изображение

enter image description here

Вот мой код ниже

import matplotlib.pyplot as plt

df_hist = pd.DataFrame(np.array(raw_data)).hist(bins=5) // raw_data is the data supplied to me
plt.savefig('/path/to/file.png')
plt.close()

Как вы видите метки оси xперекрываются.Поэтому я использовал эту функцию plt.tight_layout() вот так

import matplotlib.pyplot as plt

df_hist = pd.DataFrame(np.array(raw_data)).hist(bins=5)
plt.tight_layout()
plt.savefig('/path/to/file.png')
plt.close()

Сейчас есть некоторые улучшения

enter image description here

Но все же ярлыкислишком близко.Есть ли способ убедиться, что этикетки не соприкасаются друг с другом и между ними есть достаточный интервал?Также я хочу изменить размер изображения, чтобы сделать его меньше.

Я проверил документацию здесь https://matplotlib.org/api/_as_gen/matplotlib.pyplot.savefig.html, но не уверен, какой параметр использовать для savefig.

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Я думаю, что два лучших исправления были упомянуты Пэм в комментариях.Вы можете вращать метки с помощью plt.xticks (вращение = 45. Для получения дополнительной информации смотрите здесь: Поворот текста оси в python matplotlib

Реальная проблема - слишком много нулей, которые не предоставляютлюбая дополнительная информация. С массивами Numpy довольно легко работать, поэтому pd.DataFrame(np.array(raw_data)/1000).hist(bins=5) должен избавиться от трех нулей с обеих осей. Затем просто добавьте «килограмм» в метках осей.

Чтобы изменить размерграфика использовать rcParams.

from matplotlib import rcParams rcParams['figure.figsize'] = 7, 5.75 #the numbers are the dimensions

0 голосов
/ 05 марта 2019

Поскольку raw_data еще не является pandas кадром данных, нет необходимости превращать его в один для построения графика.Вместо этого вы можете строить графики напрямую с помощью matplotlib.

Есть много разных способов достичь того, что вы хотите.Я начну с настройки некоторых данных, похожих на ваши:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gamma

raw_data = gamma.rvs(a=1, scale=1e6, size=100)

Если мы пойдем дальше и используем matplotlib для создания гистограммы, мы можем обнаружить, что xticks расположены слишком близко друг к другу:

fig, ax = plt.subplots(1, 1, figsize=[5, 3])
ax.hist(raw_data, bins=5)
fig.tight_layout()

enter image description here

Символы трудно читать со всеми нулями, независимо от расстояния.Итак, одна вещь, которую вы можете сделать, это использовать научное форматирование.Это делает ось X намного проще для интерпретации:

ax.ticklabel_format(style='sci', axis='x', scilimits=(0,0))

enter image description here

Другой вариант, без использования научного форматирования, - это вращать галочки (какупоминается в комментариях):

ax.tick_params(axis='x', rotation=45)
fig.tight_layout()

enter image description here

Наконец, вы также упомянули изменение размера изображения.Обратите внимание, что это лучше всего сделать, когда фигура инициализирована.Вы можете установить размер фигуры с помощью аргумента figsize.Следующее создаст фигуру 5 "в ширину и 3" в высоту:

fig, ax = plt.subplots(1, 1, figsize=[5, 3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...