Создание пользовательских осей в matplotlib без влияния на отображаемое изображение - PullRequest
2 голосов
/ 08 мая 2020

Как мне создать пользовательские оси на графике matplotlib, не затрагивая отображаемые данные?

Я хочу построить некоторые данные с изображением (из которого данные) под самим графиком с теми же осями, что и график данных.

Для построенных данных я скорректировал оси x, используя np.linespace(), но я не могу этого сделать для изображения.

Ниже приведены примерное изображение и пример кода того, что я смог создать сам. Что я пытаюсь сделать, так это то, что по оси x подзаголовка изображения отображаются те же отметки и метки, что и на подзаголовке данных. Это не должно изменять внешний вид отображаемых данных или самого изображения, только отметки / метки осей.

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

#create figure
fig, axs=plt.subplots(nrows=2, ncols=1, figsize=(6, 4), dpi=300)

#plot example function in subplot 0
time = np.linspace(0, 10, 100)
axs[0].plot(time, np.sin(time))
axs[0].set_xlim(0-2, 10+2)

#load image
img = cv.imread(r"lena.png")
#convert BGR to RGB
RGB_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

#show image in subplot 1
axs[1].imshow(RGB_img)
axs[1].set_xlim(0-2, img.shape[1]+2)
axs[1].get_yaxis().set_visible(False)

1 Ответ

2 голосов
/ 08 мая 2020

Изменить: Включены предложения OP для автоматизации процесса.

Вы можете установить произвольные отметки и метки с помощью ax.set_xticks() и ax.set_xticklabels(). Комбинируя это с ax.get_xticks(), можно вычислить тики изображения из исходных тиков:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

#create figure
fig, axs=plt.subplots(nrows=2, ncols=1, figsize=(6, 4), dpi=300)

#plot example function in subplot 0
time = np.linspace(0, 10, 100)
axs[0].plot(time, np.sin(time))
axs[0].set_xlim(0-2, 10+2)

#load image
img = mpimg.imread(r"lena.png")

#show image in subplot 1
axs[1].imshow(img)
axs[1].set_xlim(0-2, img.shape[1]+2)
axs[1].get_yaxis().set_visible(False)

# convert the ticks from the data to the pixel values
ticks_new = axs[0].get_xticks() * (img.shape[1] / 10)
axs[1].set_xticks(ticks_new)

# set labels
tick_labels = [int(round(x)) for x in axs[0].get_xticks()]
axs[1].set_xticklabels(tick_labels);

sample plot

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