Как сделать xticklabel с разным шагом сетки в Matplotlib? - PullRequest
0 голосов
/ 28 декабря 2018

Как построить диаграмму с младшей сеткой 1, основной сеткой 10 и с приращением xticklabels 20 единиц ?

Вот мой пример кода и вывод с приращением xticklabels каждые 10единицы:

plt.figure(figsize=(10, 10))
ax = plt.gca()
major_ticks = np.arange(0, 60, 10)    
minor_ticks = np.arange(0, 60, 1)
ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor=True)
ax.set_yticks(major_ticks)
ax.set_yticks(minor_ticks, minor=True)
ax.grid(which='major')
ax.grid(which='minor', alpha=0.5)
ax.set_aspect('equal')

enter image description here

Но затем я хотел отобразить xticklabels и yticklabels с шагом 20 вместо 10, как показано здесь, вот так:

enter image description here

Есть идеи, как этого добиться?Спасибо

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Просто добавьте следующие 4 строки в конец кода: вам просто нужно скрывать каждую вторую метку основного тика.Это в значительной степени, чтобы получить то, что вы хотите.[1::2] индексирование означает, что начинать со второго индекса и брать каждый второй элемент оттуда.Я должен начать со второго индекса, потому что метка тика в первом индексе равна 0, который вы не хотите удалять.

РЕДАКТИРОВАТЬ: ЕСЛИ вам нужны основные галочки в местах, где у вас есть метки тиков,Вы можете сделать следующие модификации (отмечены стрелкой <---).Вам может пригодиться официальные документы .

График без основных тиков, но с небольшими тиками

# Hiding for x-axis
for t in ax.xaxis.get_major_ticks()[1::2]:
    t.label.set_visible(False)
    t.tick1On = False # <----

# Hiding for y-axis
for t in ax.yaxis.get_major_ticks()[1::2]:
    t.label.set_visible(False)    
    t.tick1On = False # <----

enter image description here

Сюжет без второстепенных и основных тиков

Если вы также хотите скрыть второстепенные тики, вы можете сделать следующее в дополнение к приведенному выше коду

for t in ax.xaxis.get_minor_ticks():
    t.tick1On = False
    # t._apply_params(width=0) # suggested by Jayjayyy

for t in ax.yaxis.get_minor_ticks():
    t.tick1On = False     
    # t._apply_params(width=0) # suggested by Jayjayyy

Прямой путь обхода всех циклов, как предлагает Jayjayyy

ax.tick_params(axis='both', which='minor', width=0)   

enter image description here

0 голосов
/ 29 декабря 2018

Обновление:

Это выглядит, может быть, немного лучше:

ax.set_xticklabels(['' if i % 2 else l for i, l in enumerate(ax.get_xticks())])
ax.set_yticklabels(['' if i % 2 else l for i, l in enumerate(ax.get_yticks())])

Я думаю, вам придется вручную устанавливать каждую вторую метку на'':

import matplotlib.pyplot as plt
import numpy as np

plt.figure(figsize=(10, 10))
ax = plt.gca()
major_ticks = np.arange(0, 60, 10)    
minor_ticks = np.arange(0, 60, 1)
ax.set_xticks(major_ticks)
ax.set_xticks(minor_ticks, minor=True)
ax.set_yticks(major_ticks)
ax.set_yticks(minor_ticks, minor=True)
ax.grid(which='major')
ax.grid(which='minor', alpha=0.5)
ax.set_aspect('equal')

xticks = ax.get_xticks().tolist()
for i in range(1, len(xticks), 2):
    xticks[i] = ''
ax.set_xticklabels(xticks)

yticks = ax.get_yticks().tolist()
for i in range(1, len(yticks), 2):
    yticks[i] = ''
ax.set_yticklabels(yticks)

plt.show()

И участки:

plot

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