Добавить собственный логарифм c отметку в matplotlib - PullRequest
0 голосов
/ 09 июля 2020

У меня есть линейный график, где ось x - логарифм c. Я хотел бы отметить на этой оси конкретное значение c (40000). Это означает, что я хотел бы вставить в это место специальную основную галочку. Я попытался явно установить xticks, используя set_xticks(), сгенерированный из numpy s logspace, который вроде работает, но не добавляет автоматически метку для дополнительного тика. Как я могу это сделать? Кроме того, могу ли я настроить линию сетки для этой дополнительной отметки?

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.power(sizes, 2), hsv_mat_times, label="HSV Material Shader")
ax.plot(np.power(sizes, 2), brick_mat_times, label="Brick Material Shader")
ax.set_title("Python Shader Rendering Performance")
ax.set_xlabel("Number of Pixels")
ax.set_ylabel("CPU Rendering Time (ms)")
formatter = FuncFormatter(lambda x, pos: "{:.3}".format(x / 1000000))
xticks = np.logspace(2,6,num=5)
xticks = np.insert(xticks,4,200*200)
ax.set_xscale("log")
ax.set_xticks(xticks)
ax.legend()
plt.show()

И это результат, который я получаю с пометкой желаемого результата. enter image description here

Edit Thanks for the answers, they are great solutions using FuncFormatter. I did however stumble across a solution using axvline to add a vertical line at 200x200. This is my new solution, using minor ticks for the extra tick.

def log_format(x, pos):
    return "$200\\times 200$"

fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(1, 1, 1)
ax.plot(np.power(sizes, 2), hsv_mat_times, label="HSV Material Shader")
ax.plot(np.power(sizes, 2), brick_mat_times, label="Brick Material Shader")
ax.plot(np.power(sizes, 2), hsv_mat_times2, label="PLACEHOLDER FOR 3rd shader")
ax.set_title("Python Shader Rendering Performance", fontsize=18)
ax.set_xlabel("Number of Pixels")
ax.set_ylabel("CPU Rendering Time (ms)")
ax.set_xscale("log")
ax.set_xticks([200*200], minor=True)
ax.xaxis.grid(False, which="minor")
ax.axvline(200*200, color='white', linestyle="--")
ymin,ymax = ax.get_ylim()
ax.text(200*200 - 200*50, (ymax-ymin)/2, "Default render size", rotation=90, va="center", style="italic")
ax.xaxis.set_minor_formatter(FuncFormatter(log_format))
ax.legend()
plt.show()

Что дает окончательный результат: введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 09 июля 2020
from matplotlib.ticker import FuncFormatter, LogFormatterMathtext
ax.xaxis.set_major_formatter(FuncFormatter(lambda x,_: '$\\mathdefault{0.4*10^{5}}$' if x == 40000 else LogFormatterMathtext()(x)))

Формат установить соответствующую линию сетки:

ax.xaxis.get_gridlines()[4].set_c('r')

пример

1 голос
/ 09 июля 2020

Вы можете попробовать использовать ScalarFormatter() после установки xticks.

xticks = np.logspace(2,6,num=5)
xticks = np.insert(xticks,4,200*200)
ax.set_xscale("log")
ax.set_xticks(xticks)

# add this line
ax.get_xaxis().set_major_formatter(matplotlib.ticker.ScalarFormatter())

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

Есть сообщение, в котором подробно объясняется шкала журнала https://atmamani.github.io/cheatsheets/matplotlib/matplotlib_2/

Надеюсь, поможет: -)

...