私は prefuse 視覚化ツールキットを使用しています。ツールキットの GraphView Demo は、データを視覚化するためのさまざまなコントロールを提供する素晴らしいものです。
データセットの GraphML を生成し、GraphView を使用して視覚化することができます。追加したいことの 1 つは、2 つのノード間の強度を示すために、重みまたは色分けでエッジにラベルを付けることです。
同じことについての入力は大歓迎です..ありがとう..
私は prefuse 視覚化ツールキットを使用しています。ツールキットの GraphView Demo は、データを視覚化するためのさまざまなコントロールを提供する素晴らしいものです。
データセットの GraphML を生成し、GraphView を使用して視覚化することができます。追加したいことの 1 つは、2 つのノード間の強度を示すために、重みまたは色分けでエッジにラベルを付けることです。
同じことについての入力は大歓迎です..ありがとう..
免責事項: ドキュメントを確認しただけで、API を使用したことはありません:) API には、目的の動作を実現するために実装する必要がある EdgeRenderer インターフェイスがあるようです。
参照: http://prefuse.org/doc/manual/introduction/example/、http://prefuse.org/doc/api/prefuse/render/DefaultRendererFactory.html _
更新: 最初に訂正: 実際、EdgeRenderer は iterface ではなくクラスです。カスタム エッジ レンダリングの実装方法を示す簡単なデモを作成しました。
ノード ラベルのイニシャルを含むエッジにラベルを追加する
LabelRenderer をコピーし、エッジを処理するために変更した、迅速で汚いソリューションを作成しました。
クラスに次の名前を付けましたMyEdgeRenderer
:
public class MyEdgeRenderer extends AbstractShapeRenderer {
オリジナルEdgeRenderer
を使用してエッジ ラインを描画します (render()
動作中のレンダラーについては以下を参照してください)。
protected EdgeRenderer m_edgeRenderer = new EdgeRenderer();
getText()
ノードからイニシャルを取得するように変更します。
protected String getText(VisualItem item) {
EdgeItem edge = (EdgeItem)item;
VisualItem item1 = edge.getSourceItem();
VisualItem item2 = edge.getTargetItem();
String t1 = null, t2 = null;
if ( item1.canGetString(m_labelName) ) {
t1 = item1.getString(m_labelName).substring(0,1);
};
if ( item2.canGetString(m_labelName) ) {
t2 = item2.getString(m_labelName).substring(0,1);
};
if (t1 != null && t2 != null)
return t1 + "-" + t2;
else
return null;
}
getAlignedPoint()
ラベルを端の途中に配置するように変更:
protected void getAlignedPoint(Point2D p, VisualItem item,
double w, double h, int xAlign, int yAlign)
{
double x=0, y=0;
EdgeItem edge = (EdgeItem)item;
VisualItem item1 = edge.getSourceItem();
VisualItem item2 = edge.getTargetItem();
// label is positioned to the center of the edge
x = (item1.getX()+item2.getX())/2;
y = (item1.getY()+item2.getY())/2;
...
render()
(I) 最初に線を描画し、(II) 黒色を使用するように変更します。
public void render(Graphics2D g, VisualItem item) {
m_edgeRenderer.render(g, item);
...
// render text
int textColor = ColorLib.color(Color.BLACK); // item.getTextColor()
if ( text != null && ColorLib.alpha(textColor) > 0 ) {
...
テストのために、Prefuse Web サイト (http://prefuse.org/doc/manual/introduction/example/Example.java) にあるサンプルを変更しました。
// -- 3. the renderers and renderer factory ---------------------------
// draw the "name" label for NodeItems
LabelRenderer ir = new LabelRenderer("name");
ir.setRoundedCorner(8, 8); // round the corners
// draw the "name" initials for EdgeItems
MyEdgeRenderer er = new MyEdgeRenderer("name");
er.setRoundedCorner(8, 8); // round the corners
// create a new default renderer factory
// return our name label renderer as the default for all non-EdgeItems
// includes straight line edges for EdgeItems by default
vis.setRendererFactory(new DefaultRendererFactory(ir, er));
これは、カスタム レンダリングを説明するための単なるデモです。実際には、おそらくグラフ モデルからラベル テキストと色を取得しますEdgeItem.getString(), getTextColor()
。どちらの属性も GraphML データに由来する可能性があると思います。また、サンプルコードはノードの色を設定する方法を示していますが、エッジにも適用される可能性があります (私は試していませんが):
// -- 4. the processing actions ---------------------------------------
...
// use black for node text
ColorAction text = new ColorAction("graph.nodes",
VisualItem.TEXTCOLOR, ColorLib.gray(0));