Как установить интервал в matplotlib при использовании xlim. Или можно ли использовать поля() с xlim()?

По умолчанию matplotlib всегда добавляет пробелы между вашими первыми точками данных и осью, как вы можете видеть на изображении: График по умолчанию с пробелами между данными и осью. Был использован следующий код:

import matplotlib.pyplot as plt
data = [1, 2, 3, 4, 5]
fig, ax = plt.subplots()
ax.plot(data)
plt.show()

Теперь, когда я добавляю xlim с помощью ax.set_xlim(2), список пробелов исчезает:

Как установить интервал в matplotlib при использовании xlim. Или можно ли использовать поля() с xlim()?

Как я могу ограничить оси, но также использовать интервал (чтобы линия не касалась осей)?

Обновлено: Итак, мой желаемый результат выглядит так:

Как установить интервал в matplotlib при использовании xlim. Или можно ли использовать поля() с xlim()?

Я пытался использовать поля(), но похоже, что он не работает вместе с xlim/ylim, независимо от порядка, в котором я их вызываю.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
59
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы отметите ax.get_xlim() в исходной команде и увидите:

ax.get_xlim()
# (-0.2, 4.2)

Это пустое пространство на самом деле составляет 0,2 единицы с каждой стороны.

Вам следует просто сделать то же самое:

ax.set_xlim(2-0.2)

Выход:

Если вы не хотите, чтобы линия касалась оси, это немного сложнее, вам придется обрезать ее маской:

from matplotlib.patches import Rectangle
import matplotlib.pyplot as plt

data = [1, 2, 3, 4, 5]
fig, ax = plt.subplots()
ax.plot(data)

# change the axis
ax.set_xlim(2-0.2)

# create a mask
x0, x1 = 2, 4
y0, y1 = 1, 5

mask = Rectangle((x0, y0), x1-x0, y1-y0, facecolor='none', edgecolor='none')
ax.add_artist(mask)

# clip all the lines with the mask
for line in ax.lines:
    line.set_clip_path(mask)

Выход:

Спасибо за ваш ответ, но синяя линия все еще касается оси Y. Я редактирую свой вопрос, чтобы сделать его более понятным, и добавляю изображение желаемого результата.

flx 19.06.2024 10:01

@flx посмотри обновление, дальше тебе придется его обрезать

mozway 19.06.2024 10:04
Ответ принят как подходящий

Чтобы построить только подмножество набора данных, хороший подход — обрезать данные до того, что вам нужно, поскольку это позволяет форматированию matplotlib работать как обычно.

import matplotlib.pyplot as plt
import numpy as np

Я использую numpy для организации и скорости больших наборов данных.

data = [1, 2, 3, 4, 5] # some dataset

Это будет работать с любым набором данных без каких-либо дополнительных действий, кроме настройки диапазона.

range_to_plot = (2,4) # setting a range to plot min and max values

Этот диапазон представляет собой минимальное и максимальное значение по оси X для построения графика. Просто установите длину данных, чтобы установить только нижний предел.

x_values = np.arange(len(data)) # x values for the data
data_to_plot = np.array(data, dtype=float) # data to plot

data_to_plot[x_values < range_to_plot[0]] = np.nan # setting values outside the range to nan
data_to_plot[x_values > range_to_plot[1]] = np.nan # setting values outside the range to nan

Создание массива для значений оси X упрощает работу с осью. Установка значений в данных для отображения в виде nan s, если они выходят за пределы установленного диапазона по оси X.

fig, ax = plt.subplots()
ax.plot(x_values, data_to_plot)
ax.set_xlim(range_to_plot[0]-0.1, range_to_plot[1]+0.1)
plt.show()

Наш set_xlim включает смещения за пределы диапазона, который мы нанесли на график, чтобы создать пробел между осью и нанесенной линией.

В результате получается такой график:

Обратите внимание, что это будет работать только в том случае, если точка разделения также является точкой в ​​наборе данных. Например, если вы хотите установить нижний X равным 2,5, это не сработает.

mozway 19.06.2024 11:04

Это будет работать только в том случае, если точка разделения является значением в наборе точек оси X.

C L 19.06.2024 11:58

Спасибо, я надеялся, что существует решение для матплота, но это похоже на хороший обходной путь!

flx 20.06.2024 10:41

Вы можете определить поле для вырезания любого художника Matplotlib. Обратите внимание, что он должен находиться в системе координат дисплея, поэтому здесь я использую преобразование transData, чтобы получить к нему координаты данных. Подробности смотрите в Учебнике по трансформациям.

import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox, TransformedBbox

data = [1, 2, 3, 4, 5]
fig, ax = plt.subplots()

# Create a box in data coordinates and transform it to display coordinates.
bbox = TransformedBbox(Bbox([[2, 2], [4, 5]]), ax.transData)
line, = ax.plot(data)
line.set_clip_box(bbox)
plt.show()

Другие вопросы по теме