Как получить экспоненциально масштабированную ось? - PullRequest
7 голосов
/ 04 февраля 2011

Рассмотрим следующий код:

from numpy import log2
import matplotlib.pyplot as plt

xdata = [log2(x)*(10/log2(10)) for x in range(1,11)]
ydata = range(10)
plt.plot(xdata, ydata)
plt.show()

Это приводит к следующему графику: The plot I do not want У меня вопрос, как я могу изменить это, чтобы появился график с точно такими же данными, как у вводакак прямая линия?Это в основном требует соответствующего масштабирования оси X, но я не могу понять, как это сделать.Причина для этого заключается в том, что в начале я показываю функцию, которая очень мало меняется, но начинает больше колебаться в конце допустимого интервала, поэтому я хочу иметь более высокое горизонтальное разрешение в конце.Если кто-то может предложить альтернативное решение для моего подхода, не стесняйтесь сделать это!

Ответы [ 2 ]

7 голосов
/ 04 февраля 2011

Вот как это сделано. Хороший пример для подражания. Вы просто создаете класс ScaleBase .

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

from numpy import log2
import matplotlib.pyplot as plt

from matplotlib import scale as mscale
from matplotlib import transforms as mtransforms

class CustomScale(mscale.ScaleBase):
    name = 'custom'

    def __init__(self, axis, **kwargs):
        mscale.ScaleBase.__init__(self)
        self.thresh = None #thresh

    def get_transform(self):
        return self.CustomTransform(self.thresh)

    def set_default_locators_and_formatters(self, axis):
        pass

    class CustomTransform(mtransforms.Transform):
        input_dims = 1
        output_dims = 1
        is_separable = True

        def __init__(self, thresh):
            mtransforms.Transform.__init__(self)
            self.thresh = thresh

        def transform_non_affine(self, a):
            return 10**(a/10)

        def inverted(self):
            return CustomScale.InvertedCustomTransform(self.thresh)

    class InvertedCustomTransform(mtransforms.Transform):
        input_dims = 1
        output_dims = 1
        is_separable = True

        def __init__(self, thresh):
            mtransforms.Transform.__init__(self)
            self.thresh = thresh

        def transform_non_affine(self, a):
            return log2(a)*(10/log2(10))

        def inverted(self):
            return CustomScale.CustomTransform(self.thresh)


mscale.register_scale(CustomScale)

xdata = [log2(x)*(10/log2(10)) for x in range(1,11)]
ydata = range(10)
plt.plot(xdata, ydata)

plt.gca().set_xscale('custom')
plt.show()
2 голосов
/ 04 февраля 2011

Самый простой способ - использовать полулогию

from numpy import log2
import matplotlib.pyplot as plt

xdata = log2(range(1,11)) * (10/log2(10))
ydata = range(10)
plt.semilogy(xdata, ydata)
plt.show()

enter image description here

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