По умолчанию 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)
, список пробелов исчезает:
Как я могу ограничить оси, но также использовать интервал (чтобы линия не касалась осей)?
Обновлено: Итак, мой желаемый результат выглядит так:
Я пытался использовать поля(), но похоже, что он не работает вместе с xlim/ylim, независимо от порядка, в котором я их вызываю.
Если вы отметите 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)
Выход:
@flx посмотри обновление, дальше тебе придется его обрезать
Чтобы построить только подмножество набора данных, хороший подход — обрезать данные до того, что вам нужно, поскольку это позволяет форматированию 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, это не сработает.
Это будет работать только в том случае, если точка разделения является значением в наборе точек оси X.
Спасибо, я надеялся, что существует решение для матплота, но это похоже на хороший обходной путь!
Вы можете определить поле для вырезания любого художника 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()
Спасибо за ваш ответ, но синяя линия все еще касается оси Y. Я редактирую свой вопрос, чтобы сделать его более понятным, и добавляю изображение желаемого результата.