В matplotlib, как вы рисуете тики оси R-стиля, указывающие наружу от осей?
Поскольку они вычерчены внутри области графика, тики оси затенены данными во многих графиках matplotlib. Лучшим подходом является рисование тиков, проходящих от осей наружу, как по умолчанию в ggplot
, системе построения R.
В теории это можно сделать, перерисовывая линии тика с помощью стилей TICKDOWN
и TICKLEFT
для тиков x-оси и y-оси соответственно:
import matplotlib.pyplot as plt
import matplotlib.ticker as mplticker
import matplotlib.lines as mpllines
# Create everything, plot some data stored in `x` and `y`
fig = plt.figure()
ax = fig.gca()
plt.plot(x, y)
# Set position and labels of major and minor ticks on the y-axis
# Ignore the details: the point is that there are both major and minor ticks
ax.yaxis.set_major_locator(mplticker.MultipleLocator(1.0))
ax.yaxis.set_minor_locator(mplticker.MultipleLocator(0.5))
ax.xaxis.set_major_locator(mplticker.MultipleLocator(1.0))
ax.xaxis.set_minor_locator(mplticker.MultipleLocator(0.5))
# Try to set the tick markers to extend outward from the axes, R-style
for line in ax.get_xticklines():
line.set_marker(mpllines.TICKDOWN)
for line in ax.get_yticklines():
line.set_marker(mpllines.TICKLEFT)
# In real life, we would now move the tick labels farther from the axes so our
# outward-facing ticks don't cover them up
plt.show()
Но на практике это только половина решения, потому что методы get_xticklines
и get_yticklines
возвращают только основные тиковые линии. Маленькие тики продолжают указывать внутрь.
Какая работа для второстепенных тиков?
Ответы
Ответ 1
В вашем конфигурационном файле matplotlib, matplotlibrc, вы можете установить:
xtick.direction : out # direction: in or out
ytick.direction : out # direction: in or out
и по умолчанию это будут как основные, так и второстепенные тики, например R. Для одной программы просто выполните:
>> from matplotlib import rcParams
>> rcParams['xtick.direction'] = 'out'
>> rcParams['ytick.direction'] = 'out'
Ответ 2
Вы можете получить несовершеннолетних по крайней мере двумя способами:
>>> ax.xaxis.get_ticklines() # the majors
<a list of 20 Line2D ticklines objects>
>>> ax.xaxis.get_ticklines(minor=True) # the minors
<a list of 38 Line2D ticklines objects>
>>> ax.xaxis.get_minorticklines()
<a list of 38 Line2D ticklines objects>
Обратите внимание, что 38 - это то, что в "крупных" местах также были выведены малые тиковые линии по вызову MultipleLocator.