Изменение увеличения тика в Matplotlib [дубликат]

  1. GCC не реализует rd.entropy () правильно - он всегда возвращает 0 (по крайней мере, в Mac OS X).
  2. К сожалению, похоже, что нет никакой возможности смешать дополнительную энтропию в random_device, что важно, потому что обычно / часто (посмотрите на Linux / dev / random и / dev / urandom, а также на реализацию Intel RDRAND) реализует генератор псевдослучайных чисел под капотом. Я бы хотел улучшить свой результат, введя что-то, что я считаю случайным, чтобы смешиваться с тем, что производит его источник энтропии. Опять же, поскольку это устройство (или модуль ядра) внутренне реализует криптографический алгоритм для обработки битов энтропии, которые он получает для генерации своего вывода, я хотел бы иметь возможность «рандомизировать» этот процесс больше путем инъекции мои собственные данные должны смешиваться с любой энтропией, которую выбирает устройство. Например, рассмотрим Java SecureRandom (). Это не позволяет вам устанавливать семя (которое действительно преобразует его в PRNG), но оно будет радостно смешивать то, что вы предоставляете, тем, что оно использует, чтобы «рандомизировать» свой результат еще больше.
  3. Я лично предпочитают RDRAND. Небольшая сборная библиотека с компактным интерфейсом C. Вот ссылки: Дэвид Джонсон из Intel объясняет RDRAND на Stackoverflow Указатели Stackoverflow для источника библиотеки RDRAND для Windows, Linux и Mac OS X Блог Intel в библиотеке RDRAND , и ссылку для скачивания
287
задан Daan 27 September 2012 в 13:43
поделиться

9 ответов

Вы можете явно указать, где вы хотите отметить отметки с помощью 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()
334
ответ дан unutbu 17 August 2018 в 14:51
поделиться
  • 1
    Нет ли способа заставить его по-прежнему решать свои собственные ограничения, но просто изменить размер шага? Этот метод не очень хорош, если мин - это что-то вроде 3523.232512! – Corone 1 October 2013 в 17:41
  • 2
    @Corone. Прошло некоторое время с тех пор, как вы спросили, но я опубликовал ответ ниже, который позволяет легко контролировать размер шага, сохраняя при этом автоматическое определение границ. – jthomas 26 March 2016 в 14:04
  • 3
    Обратите внимание, что +1 в plt.xticks(np.arange(min(x), max(x)+1, 1.0)) требуется для отображения последнего галочки. – Alex Willison 19 May 2017 в 15:23
  • 4
    Да, np.arange(start, stop) генерирует значения в интервале полуоткрытого [start, stop), включая start, но исключая stop. Поэтому я использовал max(x)+1, чтобы включить max(x). – unutbu 19 May 2017 в 16:19
  • 5
    есть эквивалент для datetime, например. plt.xticks(np.arange(min(dates), max(dates)+0.1,0.1)? кажется, только графики года – WBM 10 January 2018 в 12:42
xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

Это сработало для меня

, если вы хотите, чтобы тики между [1,5] (1 и 5 включительно) заменили

length = 5
1
ответ дан BartoszKP 17 August 2018 в 14:51
поделиться
  • 1
    fyi, вы могли бы просто написать xmarks = range(1, length+1, 1). довольно уверен, что понимание списков излишне. – Neal 21 July 2017 в 13:30
  • 2
    Благодарю. Пробовал много способов, но нашел, что это то, что именно я искал – Megha 3 November 2017 в 17:50

Это немного взломанный, но, безусловно, самый чистый / самый легкий для понимания пример, который я нашел для этого. Это из ответа на 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)
23
ответ дан Community 17 August 2018 в 14:51
поделиться
  • 1
    Это самое простое и общее решение. Крошечная настройка: обычно ax.get_xticklabels()[1::2] - ярлыки, которые должны быть скрыты. – jolvi 22 September 2015 в 12:02
  • 2
    Это не работает с matplotlib.finance.candlestick2 – BCR 12 February 2016 в 17:12
  • 3
    @BCR может быть, что некоторые из xticklabels просто установлены на '', так что, когда вы их проецируете, вы делаете 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()
7
ответ дан Deninhos 17 August 2018 в 14:51
поделиться

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

ax.set_xticks(ax.get_xticks()[::2])
40
ответ дан glopes 17 August 2018 в 14:51
поделиться

Вот чистая реализация 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()
1
ответ дан Greenstick 17 August 2018 в 14:51
поделиться

Мне нравится это решение (из 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() , позволяет автоматическое определение предела и легко читается позже.

65
ответ дан jthomas 17 August 2018 в 14:51
поделиться
  • 1
    Способ сделать это без вычисления тиков явно! – Zelphir 31 August 2016 в 09:48
  • 2
    Это тот же ответ, что и этот . Не имеет смысла добавлять идентичный ответ через два года. – ImportanceOfBeingErnest 23 June 2017 в 10:41
  • 3
    Хороший улов. Я не узнал их так же, когда отправил ответ. Тем не менее, я думаю, что эту презентацию немного легче понять. – jthomas 23 June 2017 в 15:17
  • 4
    Ссылка на книгу в этом ответе также предоставляет полезный источник для получения дополнительной информации. – Steven C. Howell 16 April 2018 в 19:50

Другой подход - установить локатор оси:

import matplotlib.ticker as plticker

loc = plticker.MultipleLocator(base=1.0) # this locator puts ticks at regular intervals
ax.xaxis.set_major_locator(loc)

В зависимости от ваших потребностей существует несколько разных типов локаторов.

130
ответ дан robochat 17 August 2018 в 14:51
поделиться
  • 1
    Это не работает должным образом. В частности, при использовании дат он не использует соответствующие даты. – Chris Fonnesbeck 5 February 2014 в 19:02
  • 2
    При использовании дат вам следует использовать методы в модуле matplotlib.dates. Например, matplotlib.dates.AutoDateLocator() – robochat 20 March 2014 в 15:06
  • 3
    Это должно быть приемлемым решением. – onewhaleid 17 March 2016 в 22:19
  • 4
    Он работал как ожидалось для меня, с датами. Это решение намного проще, чем принятое. – Pablo Suau 8 July 2016 в 13:58

Это старая тема, но я время от времени натыкаюсь на нее и выполняю эту функцию. Это очень удобно:

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

и снова запустите функцию повторной настройки.

10
ответ дан Tompa 17 August 2018 в 14:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: