2015-04-16 3 views
0

Я хотел бы построить интерактивный график (как в G = (V, E) с вершинами и ребрами) с использованием python, и я хотел бы отображать изображения поверх каждой вершины.Как создать граф в python (pyqtgraph), где вертикали отображают изображения?

Я использую это, чтобы визуализировать проблему кластеризации от среднего до большого размера, поэтому я хотел бы, чтобы какой бы то ни было бэкенд, который я использую, должен быть очень быстрым (поэтому networkx, похоже, не режет его).

Я в основном ищу для создания набора вершин и назначения изображения (или пути к изображению или функции для создания изображения) для каждого. Затем я хочу указать соединения между вершинами и их весами.

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

Было бы здорово, если бы я мог перемещать узлы с помощью мыши, но опять же, а не конец света, если мне нужно построить это в себе. Мне просто нужно добраться до начальной точки.

Я использовал этот демонстрационный код для построения графика.

import pyqtgraph as pg 
import numpy as np 

# Enable antialiasing for prettier plots 
pg.setConfigOptions(antialias=True) 

w = pg.GraphicsWindow() 
w.setWindowTitle('pyqtgraph example: GraphItem') 
v = w.addViewBox() 
v.setAspectLocked() 

g = pg.GraphItem() 
v.addItem(g) 

## Define positions of nodes 
pos = np.array([ 
    [0,0], 
    [10,0], 
    [0,10], 
    [10,10], 
    [5,5], 
    [15,5] 
    ]) 

## Define the set of connections in the graph 
adj = np.array([ 
    [0,1], 
    [1,3], 
    [3,2], 
    [2,0], 
    [1,5], 
    [3,5], 
    ]) 

## Define the symbol to use for each node (this is optional) 
symbols = ['o','o','o','o','t','+'] 

## Define the line style for each connection (this is optional) 
lines = np.array([ 
    (255,0,0,255,1), 
    (255,0,255,255,2), 
    (255,0,255,255,3), 
    (255,255,0,255,2), 
    (255,0,0,255,1), 
    (255,255,255,255,4), 
    ], dtype=[('red',np.ubyte),('green',np.ubyte),('blue',np.ubyte),('alpha',np.ubyte),('width',float)]) 

## Update the graph 
g.setData(pos=pos, adj=adj, pen=lines, size=1, symbol=symbols, pxMode=False) 

Я попытался чейнинга символов использовать элемент изображения pyqtgraph, но это не похоже на работу.

# My Code to make an image 
img = ibs.get_annot_chips(cm.qaid) 
img_item = pg.ImageItem(img) 
# .... 
# breaks... 
symbols = [img_item,'o','o','o','t','+'] 

Любой вход или совет о том, как это сделать?

+0

Вы получаете сообщение об ошибке? Если да, то? – ballsatballsdotballs

ответ

0

PyQtGraph не поддерживает это, но это будет очень приятная функция. Если вы посмотрите в graphicsItems/ScatterPlotItem.py, то в верхней части находится функция renderSymbol(), которая генерирует QImage на основе параметров символа, заданных пользователем. Вы могли бы изменить, добавив:

if isinstance(symbol, QtGui.QImage): 
    return symbol 

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