Центрирование меток x-tick между отметками в matplotlib
Я хочу, чтобы метки ярлыков x-tick были центрированы между отметками меток, а не центрированы вокруг меток, как показано на фотографии ниже.
Я прочитал документацию, но безрезультатно - кто-нибудь знает способ сделать это?
![enter image description here]()
Вот все, что я использовал для форматирования галочки по оси x, если это помогает:
day_fmt = '%d'
myFmt = mdates.DateFormatter(day_fmt)
ax.xaxis.set_major_formatter(myFmt)
ax.xaxis.set_major_locator(matplotlib.dates.DayLocator(interval=1))
for tick in ax.xaxis.get_major_ticks():
tick.tick1line.set_markersize(0)
tick.tick2line.set_markersize(0)
tick.label1.set_horizontalalignment('center')
Ответы
Ответ 1
Один из способов сделать это - использовать минорные тики. Идея заключается в том, что вы устанавливаете второстепенные тики, чтобы они находились на полпути между основными тиками, и вы вручную указываете метки.
Например:
import matplotlib.ticker as ticker
# a is an axes object, e.g. from figure.get_axes()
# Hide major tick labels
a.xaxis.set_major_formatter(ticker.NullFormatter())
# Customize minor tick labels
a.xaxis.set_minor_locator(ticker.FixedLocator([1.5,2.5,3.5,4.5,5.5]))
a.xaxis.set_minor_formatter(ticker.FixedFormatter(['1','2','3','4','5']))
Три строки:
- "Скрыть" 1,2,3,4,... которые у вас есть на основных тиках
- Установите незначительные тики на полпути между основными тиками (если ваши основные тики находятся на 1,2,3...)
- Вручную указывает метки для второстепенных тиков. Здесь "1" будет на уровне от 1.0 до 2.0.
Это простой пример. Возможно, вам захочется немного упростить его, заполнив списки в цикле или что-то еще.
Вы также можете поэкспериментировать с другими локаторами или форматами.
Изменить: Альтернативно, как указано в комментариях:
# Hide major tick labels
a.set_xticklabels('')
# Customize minor tick labels
a.set_xticks([1.5,2.5,3.5,4.5,5.5], minor=True)
a.set_xticklabels(['1','2','3','4','5'], minor=True)
Пример:
До:
![Before]()
После того, как:
![enter image description here]()
Ответ 2
Здесь альтернатива использованию Locators и Formatters. Он может использоваться для любых расстояний между метками:
# tick_limit: the last tick position without centering (16 in your example)
# offset: how many steps between each tick (1 in your example)
# myticklabels: string labels, optional (range(1,16) in your example)
# need to set limits so the following works:
ax.xaxis.set_ticks([0, tick_limit])
# offset all ticks between limits:
ax.xaxis.set(ticks=np.arange(offset/2., tick_limit, offset), ticklabels=myticklabels)
# turn off grid
ax.grid(False)
Так как это изменяет основные тики, сетка, возможно, придется отрегулировать - в зависимости от приложения. Это также можно обойти, используя ax.twinx()
). Это приведет к перемещению меток на противоположной стороне отдельной оси, но оставит исходную сетку нетронутой и даст две сетки: одну для исходных тиков и одну для смещений.