Обновить графический график x, y для сопоставления данных [duplicate]

flat_list = []
for i in list_of_list:
    flat_list+=i

Этот код также отлично работает, так как он просто расширяет список. Хотя это очень похоже, но только для цикла. Таким образом, он имеет меньшую сложность, чем добавление 2 для циклов.

277
задан 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()
335
ответ дан unutbu 25 August 2018 в 10:25
поделиться
xmarks=[i for i in range(1,length+1,1)]

plt.xticks(xmarks)

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

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

length = 5
1
ответ дан BartoszKP 25 August 2018 в 10:25
поделиться

Это немного взломанный, но, безусловно, самый чистый / самый легкий для понимания пример, который я нашел для этого. Это из ответа на 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 25 August 2018 в 10:25
поделиться

Я разработал неэлегантное решение. Предположим, что у нас есть ось 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 25 August 2018 в 10:25
поделиться

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

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

Вот чистая реализация 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 25 August 2018 в 10:25
поделиться

Мне нравится это решение (из 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 25 August 2018 в 10:25
поделиться

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

import matplotlib.ticker as plticker

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

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

131
ответ дан robochat 25 August 2018 в 10:25
поделиться

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

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 25 August 2018 в 10:25
поделиться
Другие вопросы по тегам:

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