Вы можете явно указать, где вы хотите отметить отметки с помощью plt.xticks
:
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
Например,
import numpy as np
import matplotlib.pyplot as plt
x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(np.arange(min(x), max(x)+1, 1.0))
plt.show()
(np.arange
] использовался вместо функции range
на Python только в том случае, если min(x)
и max(x)
являются поплавками вместо ints.)
Функция plt.plot
(или ax.plot
) будет автоматически установите ограничения по умолчанию x
и y
. Если вы хотите сохранить эти ограничения и просто измените настройку меток, вы можете использовать ax.get_xlim()
, чтобы узнать, какие ограничения уже установлены Matplotlib.
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, stepsize))
Фиксатор тиков по умолчанию должен делать приличное задание, округляя значения тика до разумного количества значащих цифр. Однако, если вы хотите получить больше контроля над форматом, вы можете определить свой собственный форматтер. Например,
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
Вот пример выполнения:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
x = [0,5,9,10,15]
y = [0,1,2,3,4]
fig, ax = plt.subplots()
ax.plot(x,y)
start, end = ax.get_xlim()
ax.xaxis.set_ticks(np.arange(start, end, 0.712123))
ax.xaxis.set_major_formatter(ticker.FormatStrFormatter('%0.1f'))
plt.show()
xmarks=[i for i in range(1,length+1,1)]
plt.xticks(xmarks)
Это сработало для меня
, если вы хотите, чтобы тики между [1,5] (1 и 5 включительно) заменили
length = 5
xmarks = range(1, length+1, 1)
. довольно уверен, что понимание списков излишне.
– Neal
21 July 2017 в 13:30
Это немного взломанный, но, безусловно, самый чистый / самый легкий для понимания пример, который я нашел для этого. Это из ответа на SO здесь:
Самый чистый способ скрыть каждую метку n-го тика в цветовой панели matplotlib?
for label in ax.get_xticklabels()[::2]:
label.set_visible(False)
Затем вы можете перебрать метки, устанавливающие их на видимые или не зависящие от нужной плотности.
edit: обратите внимание, что иногда matplotlib устанавливает метки == ''
, поэтому может показаться, что метки нет, когда на самом деле это есть и просто ничего не отображает. Чтобы убедиться, что вы просматриваете фактические видимые метки, вы можете попробовать:
visible_labels = [lab for lab in ax.get_xticklabels() if lab.get_visible() is True and lab.get_text() != '']
plt.setp(visible_labels[::2], visible=False)
ax.get_xticklabels()[1::2]
- ярлыки, которые должны быть скрыты.
– jolvi
22 September 2015 в 12:02
''
, так что, когда вы их проецируете, вы делаете xticklabels, которые пусты невидимы (что не повлияет на визуализацию, но может означать, что вы aren 't потянув правильные метки). Вы можете попробовать: vis_labels = [label for label in ax.get_xticklabels() if label.get_visible() is True]; plt.setp(vis_labels[::2], visible==False)
– choldgraf
15 February 2016 в 20:57
Я разработал неэлегантное решение. Предположим, что у нас есть ось X, а также список меток для каждой точки в X.
Пример:import matplotlib.pyplot as plt
x = [0,1,2,3,4,5]
y = [10,20,15,18,7,19]
xlabels = ['jan','feb','mar','apr','may','jun']
Предположим, что я хочу показывать метки метки только для «feb» и «jun» xlabelsnew = []
for i in xlabels:
if i not in ['feb','jun']:
i = ' '
xlabelsnew.append(i)
else:
xlabelsnew.append(i)
Good , теперь у нас есть поддельный список ярлыков. Сначала мы построили оригинальную версию. plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabels,rotation=45)
plt.show()
Теперь изменилась версия. plt.plot(x,y)
plt.xticks(range(0,len(x)),xlabelsnew,rotation=45)
plt.show()
В случае, если кто-то заинтересован в общем однострочном пространстве, просто получите текущие тики и используйте его для установки новых тиков путем выборки всех остальных тиков.
ax.set_xticks(ax.get_xticks()[::2])
Вот чистая реализация python желаемой функциональности, которая обрабатывает любые числовые ряды (int или float) с положительными, отрицательными или смешанными значениями:
def computeTicks (x, step = 5):
"""
Computes domain with given step encompassing series x
@ params
x - Required - A list-like object of integers or floats
step - Optional - Tick frequency
"""
import math as Math
xMax, xMin = Math.ceil(max(x)), Math.floor(min(x))
dMax, dMin = xMax + abs((xMax % step) - step) + (step if (xMax % step != 0) else 0), xMin - abs((xMin % step))
return range(dMin, dMax, step)
Образец вывода:
# Negative to Positive
series = [-2, 18, 24, 29, 43]
print(list(computeTicks(series)))
[-5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45]
# Negative to 0
series = [-30, -14, -10, -9, -3, 0]
print(list(computeTicks(series)))
[-30, -25, -20, -15, -10, -5, 0]
# 0 to Positive
series = [19, 23, 24, 27]
print(list(computeTicks(series)))
[15, 20, 25, 30]
# Floats
series = [1.8, 12.0, 21.2]
print(list(computeTicks(series)))
[0, 5, 10, 15, 20, 25]
# Step – 100
series = [118.3, 293.2, 768.1]
print(list(computeTicks(series, step = 100)))
[100, 200, 300, 400, 500, 600, 700, 800]
и пример использования:
import matplotlib.pyplot as plt
x = [0,5,9,10,15]
y = [0,1,2,3,4]
plt.plot(x,y)
plt.xticks(computeTicks(x))
plt.show()
Мне нравится это решение (из Matplotlib Ploutting Cookbook ):
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
x = [0,5,9,10,15]
y = [0,1,2,3,4]
tick_spacing = 1
fig, ax = plt.subplots(1,1)
ax.plot(x,y)
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
plt.show()
Это решение дает вам явное управление интервалом тика с помощью номера, указанного в ticker.MultipleLocater()
, позволяет автоматическое определение предела и легко читается позже.
Другой подход - установить локатор оси:
import matplotlib.ticker as plticker
loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)
В зависимости от ваших потребностей существует несколько разных типов локаторов.
matplotlib.dates.AutoDateLocator()
– robochat
20 March 2014 в 15:06
Это старая тема, но я время от времени натыкаюсь на нее и выполняю эту функцию. Это очень удобно:
import matplotlib.pyplot as pp
import numpy as np
def resadjust(ax, xres=None, yres=None):
"""
Send in an axis and I fix the resolution as desired.
"""
if xres:
start, stop = ax.get_xlim()
ticks = np.arange(start, stop + xres, xres)
ax.set_xticks(ticks)
if yres:
start, stop = ax.get_ylim()
ticks = np.arange(start, stop + yres, yres)
ax.set_yticks(ticks)
. Одно из препятствий для контроля тиков, подобных этому, заключается в том, что больше не нравится интерактивное автоматическое обновление максимальной шкалы после добавленной строки. Затем сделайте
gca().set_ylim(top=new_top) # for example
и снова запустите функцию повторной настройки.
+1
вplt.xticks(np.arange(min(x), max(x)+1, 1.0))
требуется для отображения последнего галочки. – Alex Willison 19 May 2017 в 15:23np.arange(start, stop)
генерирует значения в интервале полуоткрытого i>[start, stop)
, включаяstart
, но исключаяstop
. Поэтому я использовалmax(x)+1
, чтобы включитьmax(x)
. – unutbu 19 May 2017 в 16:19plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)
? кажется, только графики года – WBM 10 January 2018 в 12:42