Как построить без расширения границ оси? - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь нарисовать существующую ось, не расширяя и не изменяя ее пределы.

Например:

import numpy as np
import matplotlib.pyplot as plt

xy = np.random.randn(100, 2)

plt.scatter(xy[:,0], xy[:,1])

Создает точный график с хорошо подходящими пределами оси.

Однако, когда я пытаюсь нарисовать линию поверх него:

xlim = plt.gca().get_xlim()
plt.plot(xlim, xlim, 'k--')

пределы оси расширяются, предположительно для создания отступов вокруг новых данных.

Какможно нарисовать линию без этого отступа?

Ответы [ 4 ]

0 голосов
/ 10 октября 2018

Настройка plt.autoscale(False) предотвращает автоматическое масштабирование.

import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt

xy = np.random.randn(100, 2)
# By default plots are autoscaled. 
plt.scatter(xy[:,0], xy[:,1])

#Turn autoscaling off
plt.autoscale(False)
xlim = plt.gca().get_xlim()
plt.plot(xlim, xlim, 'k--')

plt.show()

enter image description here

0 голосов
/ 10 октября 2018

Вы можете использовать свойство autoscale объектов Axes :

В соответствии с документацией:

Axes.autoscale(enable=True, axis='both', tight=None)

Автоматическое масштабирование вида оси для данных(переключение).

Удобный метод для простого автоматического масштабирования вида оси.Включает или выключает автоматическое масштабирование, а затем, если автоматическое масштабирование для любой оси включено, выполняет автоматическое масштабирование для указанной оси или осей. Параметры:

enable : bool or None, optional
         True (default) turns autoscaling on, False turns it off. None leaves the autoscaling state unchanged.
axis : {'both', 'x', 'y'}, optional
       which axis to operate on; default is 'both'
tight: bool or None, optional
       If True, set view limits to data limits; if False, let the locator
       and margins expand the view limits; if None, use tight scaling
       if the only artist is an image, otherwise treat tight as False.
       The tight setting is retained for future autoscaling until it is
       explicitly changed.
fig, ax = plt.subplots()
ax.plot(np.random.normal(size=(100,)),np.random.normal(size=(100,)),'bo')
ax.autoscale(tight=True)
xlim = ax.get_xlim()
plt.plot(xlim, xlim, 'k--')

enter image description here

0 голосов
/ 10 октября 2018

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

plt.xlim(xlim)

когда вы получите xlim, он получит текущие ограничения, но как только вы "установите" их, они будут заблокированы, пока вы не измените их снова.Это работает и для оси y, если вы хотите, чтобы они тоже были исправлены (просто замените 'x' на 'y' и добавьте код).

0 голосов
/ 10 октября 2018

Одно из решений для перебора - отслеживать границы осей перед рисованием и сбрасывать их после.

Примерно так:

from contextlib import contextmanager

@contextmanager
def preserve_limits(ax=None):
    """ Plot without modifying axis limits """
    if ax is None:
        ax = plt.gca()

    xlim = ax.get_xlim()
    ylim = ax.get_ylim()

    try:
        yield ax
    finally:
        ax.set_xlim(xlim)
        ax.set_ylim(ylim)

Теперь сравните

plt.scatter(xy[:,0], xy[:,1])

xlim = plt.gca().get_xlim()
plt.plot(xlim, xlim, 'k--')

с

plt.scatter(xy[:,0], xy[:,1])

with preserve_limits():
    xlim = plt.gca().get_xlim()
    plt.plot(xlim, xlim, 'k--')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...