Matplotlib: Как увеличить расстояние между отметками (или уменьшить количество отметок)? - PullRequest
0 голосов
/ 18 сентября 2018

Как увеличить интервал между отметками, как на графике ниже?

Сюжет 1: Настройка

enter image description here

Dataset

time value
2010-01 1
2010-02 2
2010-03 3
2010-04 4
2010-05 5
2010-06 6 
2010-07 7
2010-08 8
2010-09 9
2010-10 8
2011-01 7
2011-02 6
2011-03 5
2011-04 4
2011-05 3
2011-06 2
2011-07 1
2011-08 2
2011-09 3
2011-10 4
2011-11 5
2011-21 6

Что я пробовал:

В посте Как: уменьшить количество тиков с помощью matplotlib , пользователь показывает, как вставить пробел между тиками меток следующим образом:

# Attempt 1
every_nth = 5
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        #print(n)
        label.set_visible(False)

Сюжет 2: попытка

enter image description here

Но, как видите, отметки остаются нетронутыми.

Итак, используя эту настройку, я наивно пытался заменить ax.xaxis.get_ticklabels() деталь на ax.get_xticks(), но пока безуспешно:

# in:
for n, tick in enumerate(ax.get_xticks()):
    if n % every_nth != 0:
        tick.set_visible(False)

# out: AttributeError: 'int' object has no attribute 'set_visible'

И, похоже, в ax.tick_params? тоже нет опции. Вы даже найдете там padding , но ничего о интервале между тиками.

Любые другие предложения будут великолепны! Обычно я бы изменил индекс на PeriodIndex и отформатировал бы ось, используя import matplotlib.dates as mdates, но я бы действительно хотел более простой метод для этого.

Вот и все, что нужно для простого копирования и вставки:

#imports
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# df = pd.read_clipboard(sep='\\s+')

# plot setup
fig, ax = plt.subplots()
ax.plot(df['time'], df['value'])
plt.xticks(rotation=45)

# Attempt 1
every_nth = 5
for n, label in enumerate(ax.xaxis.get_ticklabels()):
    if n % every_nth != 0:
        #print(n)
        label.set_visible(False)

#every_nth = 5
#for n, tick in enumerate(ax.xaxis.get_ticks()):
#    if n % every_nth != 0:
#        #print(n)
#        tick.set_visible(False)

plt.show()

1 Ответ

0 голосов
/ 18 сентября 2018

Шаг отсчета торжественно определяется разницей в последующих точках. Matplotlib обычно автоматически найдет для вас подходящие места для галочек.

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

df = pd.DataFrame({"time" : np.arange("2010-01-01", "2012-01-01", dtype="datetime64[M]"),
                   "value" : np.random.randint(0,10,size=24)})
fig, ax = plt.subplots()
ax.plot(df['time'], df['value'])
plt.setp(ax.get_xticklabels(), rotation=45, ha="right")

plt.show()

enter image description here

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

import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import pandas as pd
import numpy as np

df = pd.DataFrame({"time" : np.arange("2010-01-01", "2012-01-01", dtype="datetime64[M]"),
                   "value" : np.random.randint(0,10,size=24)})
fig, ax = plt.subplots()
ax.plot(df['time'], df['value'])
ax.xaxis.set_major_locator(mdates.MonthLocator((1,7)))
ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y-%b"))
plt.setp(ax.get_xticklabels(), rotation=45, ha="right")

plt.show()

enter image description here

Если вы действительно хотите, чтобы ваши даты были категоричными, вы можете использовать MultipleLocator. Например. отмечать каждую 5-ю категорию,

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

df = pd.DataFrame({"time" : np.arange("2010-01-01", "2012-01-01", dtype="datetime64[M]"),
                   "value" : np.random.randint(0,10,size=24)})
df["time"] = df["time"].dt.strftime('%Y-%m')

fig, ax = plt.subplots()
ax.plot(df['time'], df['value'])
ax.xaxis.set_major_locator(mticker.MultipleLocator(5))
plt.setp(ax.get_xticklabels(), rotation=45, ha="right")

plt.show()

enter image description here

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