Как добавить объект matplotlib в макет Bokeh? - PullRequest
0 голосов
/ 27 сентября 2019

Я работаю над локальным приложением Bokeh на основе вкладок и пытаюсь включить объект matplotlib в первую вкладку этого приложения.

Объект представляет собой диаграмму Венна, которая находится за пределамисфера действия Боке.

Пока что у меня есть что-то вроде этого:

import bokeh
from bokeh.plotting import figure, output_file, show
from bokeh.layouts import row, column
import matplotlib.pyplot as plt
from matplotlib_venn import venn2

output_file('test.html')

scatter = figure(plot_width = 900, plot_height = 400)

scatter.circle([1,2,3,4,5,6], [3,5,7,9,11,16], size = 12, alpha = 0.6)

bar = figure(plot_width = 450, plot_height = 400)

bar.quad(top = [3,5,7,9,11,16], bottom = 0, left = [1,2,3,4,5,6], right = [1.9,2.9,3.9,4.9,5.9,6.9])

venn2([set(['A', 'B', 'C', 'D', 'E']), set(['A', 'C', 'E', 'G', 'I'])])

plots = column(scatter, bar)

show(plots)

В идеале я хотел бы расположить диаграмму Венна так, как показано ниже.

desired layout of resulting Panel object

Я несколько наивно думал, что что-то вроде column(scatter, row(bar, plt.show())) будет работать, но это не так.

Я относительно новичок в Python и никогда раньше не использовал MatPlotLib.

1 Ответ

1 голос
/ 27 сентября 2019

Чтобы уточнить комментарий: нет никакой встроенной интеграции между Bokeh и MPL.Если вы встраиваете MPL-графику в некоторый контент Bokeh, я могу подумать о двух подходах:

  • Если вы конвертируете в формат файла, например PNG, и размещаете файл изображения где-нибудь доступнымчерез URL, вы можете использовать тег HTML <img> в Bokeh Div для отображения файла изображения.

  • В противном случае используйте PIL или какой-либо другой инструмент для создания данных NumPy из RGBA для изображения графика MPL.Затем вы можете «построить» график MPL на графике Боке, используя глиф ImageRGBA, как предлагается в комментарии.

    # Just some synthetic RGBA data
    img = np.empty((20,20), dtype=np.uint32)
    view = img.view(dtype=np.uint8).reshape((N, N, 4))
    for i in range(N):
        for j in range(N):
            view[i, j, 0] = int(i/N*255)
            view[i, j, 1] = 158
            view[i, j, 2] = int(j/N*255)
            view[i, j, 3] = 255
    
    p = figure()
    
    # must give a vector of images
    p.image_rgba(image=[img], x=0, y=0, dw=10, dh=10)
    
...