Подтвердить что ты не робот

Центрирование меток 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')
4b9b3361

Ответ 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()). Это приведет к перемещению меток на противоположной стороне отдельной оси, но оставит исходную сетку нетронутой и даст две сетки: одну для исходных тиков и одну для смещений.