Как добавить измеренные входные значения в виде меток по оси х в сгенерированную диаграмму?

#python #python-3.x #matplotlib #charts #perfplot

Вопрос:

Я использую perfplot , чтобы сделать всего несколько измерений. Я хотел бы видеть измеренные входные значения в виде меток по оси x аналогично сгенерированным меткам по оси y.

В настоящее время я вижу 10^2 10^3 10^4 10^5 10^6 10^7 метки по оси x.

Я хочу иметь 16 512 16384 524288 16777216 метки по оси x.

perfplot использует внутренне matplotlib , поэтому я думаю, что этого можно достичь.

Пример кода:

 import numpy as np
import perfplot

perfplot.show(
    setup=lambda n: np.random.rand(n),
    kernels=[
        lambda a: np.c_[a, a],
        lambda a: np.stack([a, a]).T,
        lambda a: np.vstack([a, a]).T,
        lambda a: np.column_stack([a, a]),
        lambda a: np.concatenate([a[:, None], a[:, None]], axis=1),
    ],
    labels=["c_", "stack", "vstack", "column_stack", "concat"],
    n_range=[16, 512, 16384, 524288, 16777216],
    xlabel="len(a)",
)
 

Выходной ток:

введите описание изображения здесь

Комментарии:

1. Я не понимаю вашего вопроса. Какие x-метки вы хотите увидеть?

2. @PaulH Я просто отредактировал вопрос, чтобы сделать его более ясным.

3. вам следует изучить существующие вопросы, касающиеся локаторов и форматеров осей matplotlib

Ответ №1:

Вы можете использовать plot вместо show , чтобы получить доступ к текущему объекту осей после perfplot завершения, а затем установить галочки по мере необходимости:

 import numpy as np
import perfplot
import matplotlib.pyplot as plt
import matplotlib.ticker as mt

n_range = [16, 512, 16384, 524288, 16777216]

perfplot.plot(
    setup=lambda n: np.random.rand(n),
    kernels=[
        lambda a: np.c_[a, a],
        lambda a: np.stack([a, a]).T,
        lambda a: np.vstack([a, a]).T,
        lambda a: np.column_stack([a, a]),
        lambda a: np.concatenate([a[:, None], a[:, None]], axis=1),
    ],
    labels=["c_", "stack", "vstack", "column_stack", "concat"],
    n_range=n_range,
    xlabel="len(a)",
)

ax = plt.gca()
ax.xaxis.set_ticks(n_range)
ax.xaxis.set_major_formatter(mt.StrMethodFormatter('{x}'))
plt.show()
 

введите описание изображения здесь