Python Matplotlib: как показывать определенные интервалы меток тиков при сохранении тиков - PullRequest
0 голосов
/ 09 мая 2018

Я сейчас пытаюсь построить фигуру с большим количеством галочек. Он имеет тики для каждого значения от 0 до 50, в результате чего упакованные метки тиков объединяются, что делает график довольно грязным. Я сделал галочки, используя

fig, ax = plt.subplots()
ax.set_xticks(np.arange(0,50))
ax.set_yticks(np.arange(0,50))

и скрытые метки, используя

ax.set_xticklabels([])
ax.set_yticklabels([])

Однако проблема в том, что это скрывает все метки тиков, в то время как я хочу, чтобы некоторые метки оставались так, чтобы можно было легко отслеживать с помощью меток.

Я пытался сделать

ax.set_xticklabels(np.arange(0,50,5))

но это привело только к тому, что первые 10 тиков были помечены неподходящими метками (которые были в диапазоне (0,50) с интервалом 5)

Я надеюсь найти способ показа «меток» тиков с интервалом 5 (или любым конкретным интервалом), сохраняя при этом все фактические тики (чтобы я мог использовать их для сеток).

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Matplotlib дает вам полный контроль над метками и метками с помощью локаторов и форматеров. Это часто предпочтительнее, чем установка тиков и меток на некоторые фиксированные значения через set_xticks и set_xticklabels.
Два варианта маркировки только некоторых галочек:

Использование только основных тиков

Вы можете использовать FuncFormatter для установки метки либо на значение галочки, либо на пустую строку "" в зависимости от некоторых условий.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

fig, ax = plt.subplots()
ax.plot([0,49],[1,8])

ax.xaxis.set_major_locator(mticker.MultipleLocator())

def func(x, pos):
    if not x%5:
        return "{:g}".format(x)
    else:
        return ""
ax.xaxis.set_major_formatter(mticker.FuncFormatter(func))

plt.show()

enter image description here

Использование незначительных галочек

Можно использовать основные отметки, чтобы пометить, а второстепенные отметки, чтобы остаться без маркировки. При желании можно сделать небольшие тики такими же большими, как основные.

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as mticker

fig, ax = plt.subplots()
ax.plot([0,49],[1,8])

ax.xaxis.set_major_locator(mticker.MultipleLocator(5))
ax.xaxis.set_minor_locator(mticker.MultipleLocator(1))
ax.xaxis.set_minor_formatter(mticker.NullFormatter())

# optionally make the minorticks as large as the major ticks
#ax.tick_params(axis="x", which="both", length=4)

plt.show()

enter image description here

0 голосов
/ 09 мая 2018

Как насчет создания собственного трюка:

import matplotlib.pyplot as plt
import numpy as np

names = ['aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa',
         'aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa',
         'aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa',
         'aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa',
         'aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa','aaa']
fig, ax = plt.subplots()
ax.set_xticks(np.arange(0,50))
ax.set_yticks(np.arange(0,50,5))
new_names=[]
for n,i in enumerate(names):
    if n%5==0:
        new_names.append(i)

    else:
        new_names.append('')

ax.set_xticklabels(new_names)
plt.show()

Таким образом, вы создаете новый список, содержащий только элемент каждые 5, а остальные пустые ''

Я применил только для оси х, но ту же идею можно было бы сделать для оси у

просто идея ... enter image description here

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