Установка нескольких наборов мелких тиков с помощью Matplotlib - PullRequest
2 голосов
/ 12 марта 2020

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

Конечный результат должен иметь 4 второстепенных галочки и 2 полужестких галочки между помеченными цифрами.

Бонусные баллы, если есть способ обозначить полу мелкие тики.

import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import (MultipleLocator, FormatStrFormatter,
                               AutoMinorLocator)

t = np.arange(0.0, 100.0, 0.1)
s = np.sin(0.1 * np.pi * t) * np.exp(-t * 0.01)

fig, ax = plt.subplots()
ax.plot(t, s)

#Try to set 4 minor ticks
ax.xaxis.set_minor_locator(AutoMinorLocator(4))
ax.tick_params(which='minor', length=2, color='k')

#Set 2 minor ticks that are larger
ax.xaxis.set_minor_locator(AutoMinorLocator(2))
ax.tick_params(which='minor', length=6, color='k')

#Make major ticks even larger
ax.tick_params(which='major', length=12, color='k')

plt.show()

enter image description here

1 Ответ

1 голос
/ 13 марта 2020

Два пути. Первый - грязный, и, вероятно, его лучше избегать, но не мешало бы включить его сюда. Второй, предложенный ImportanceOfBeingErnest и основанный на Как добавить третий уровень тиков в python matplotlib

fig, ax = plt.subplots()
ax.plot(t, s)

ax.xaxis.set_minor_locator(AutoMinorLocator(9))
ax.tick_params(which='major', length=12, color='k')
minor_labels = list()
i = 0
l = -2
sum_l = 1.125
for line in ax.xaxis.get_ticklines(minor=True):

    if i == 0:
        line.set_markersize(4)
        minor_labels.append('')
        i += 1
        l += sum_l
    elif i == 2:
        line.set_markersize(4)
        minor_labels.append('')
        i += 1
        l += sum_l
    elif i == 4 or i == 6 or i == 10 or i == 12 or i == 16:
        line.set_markersize(4)
        minor_labels.append('')
        i += 1
        l += sum_l
    elif i == 18:
        line.set_markersize(4)
        minor_labels.append('')
        i -= 15
        l += sum_l
    elif i == 8 or i == 14:
        line.set_markersize(8)
        minor_labels.append(l)
        i += 1
        l += sum_l
    else:
        i += 1
        l += sum_l
print(minor_labels)
ax.set_xticklabels(minor_labels,minor=True)
plt.setp(ax.xaxis.get_minorticklabels(), rotation=45)
plt.setp(ax.xaxis.get_ticklabels(), rotation=45)
plt.show()

plot 1

Решение ImportanceOfBeingErnest, похоже, следует этой логике c - возможно, он имел в виду что-то другое - это выглядит лучше, но я не смог воспроизвести комбинацию минорных / полу-минорных тиков. Возможно, со временем вы сможете сделать то, что намереваетесь, настроив его.

t = np.arange(0.0, 100.0, 0.1)
s = np.sin(0.1 * np.pi * t) * np.exp(-t * 0.01)

fig, ax = plt.subplots()
plt.plot(t, s)
ax2 = ax.twiny()
ax2.plot(t, s)
ax2.xaxis.set_ticks_position('bottom')

ax.xaxis.set_minor_locator(ticker.FixedLocator(np.arange(5, 100.01, 5)))
ax.tick_params(which='minor', length=8, color='k')

ax2.xaxis.set_major_locator(ticker.FixedLocator([]))
ax2.xaxis.set_minor_locator(ticker.FixedLocator(np.arange(1.25, 100.01,1.25)))
ax2.tick_params(which='minor', length=4, color='k')

ax.tick_params(which='major', length=12, color='k')
ax.set_xticklabels(np.arange(5, 100.01, 5),minor=True)
plt.setp(ax.xaxis.get_minorticklabels(), rotation=45)
plt.setp(ax.xaxis.get_ticklabels(), rotation=45)
plt.show()

plot 2

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