Как нарисовать горизонтальные линии сетки с относительными расстояниями? - PullRequest
0 голосов
/ 22 января 2019

Мне нужно нарисовать горизонтальные линии сетки на расстоянии 1% от предыдущей позиции линии.
Например:
----- (a * 1.01) * 1.01
----- a *1,01
----- a

enter image description here

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Вы можете написать свой собственный локатор, который устанавливает тики с коэффициентом 1,01 от предыдущего местоположения тиков.Такой локатор может выглядеть как

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

class GeomLocator(matplotlib.ticker.IndexLocator):

    def __call__(self):
        if self.axis.axis_name =="x":
            vmin, vmax = self.axis.axes.get_xlim()
        elif self.axis.axis_name =="y":
            vmin, vmax = self.axis.axes.get_ylim()
        return self.tick_values(vmin, vmax)

    def tick_values(self, vmin, vmax):
        n = int(np.log(vmax/vmin)/np.log(self._base))
        ticks = np.ones(n+2)
        ticks[1:] = self._base
        ticks = vmin * np.cumprod(ticks)
        return ticks

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

x = np.arange(301)
y = np.cumsum(np.random.randn(len(x)))
y = (y-y.min())/(y.max()-y.min()) * 7000 + 8000

fig, ax = plt.subplots()
ax.plot(x,y)

ax.yaxis.set_minor_locator(GeomLocator(1.01, None))
ax.grid(which="minor", axis="y")
plt.show()

enter image description here

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

0 голосов
/ 22 января 2019

Я не уверен, что вам действительно нужен интервал в 1%, потому что это просто изобразит множество плотно расположенных линий, и вы в конечном итоге увидите толстую полосу горизонтальных линий.Во всяком случае, вот один из способов сделать это.Я использую интервал 10% для лучшего представления, но вы можете просто заменить 1.1 на 1.01

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots()

x = np.linspace(0, 10, 50)
y = x**2 + np.random.normal(0, 1, x.shape)
plt.plot(x, y, 'bo')

minY = 10
maxY = 160

while minY < maxY:
    plt.axhline(minY, color='gray', linewidth=0.5)
    minY *= 1.1  

plt.show()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...