我正在尝试使用JUNG根据收到的数据生成动态图表。我希望边缘自动进行颜色编码,而不是基于任何条件。我试图解决这个代码,但这也失败了:
Transformer<String, Paint> edgePaint = new Transformer<String, Paint>()
{
private final Color[] palette = {Color.GREEN, Color.YELLOW, Color.RED, Color.GRAY, Color.BLUE, Color.CYAN, Color.WHITE, Color.orange};
int i=0;
@Override
public Paint transform(String graphEdge)
{
if(i == 7)
{
i = 0;
}
else
{
i = i + 1;
}
return palette[i];
}
};
viewer.getRenderContext().setEdgeDrawPaintTransformer(edgePaint);
我的边缘是字符串,并且无法预测条件设置。我需要为每个边缘使用一种颜色,而且,当我放大和缩小时,它不应该改变。这可能吗?
答案 0 :(得分:0)
(1)如果你真的想按顺序分配颜色,包裹一个列表(例如RGBRGBRG ......),那么你可以定义一个Map,然后根据你的喜好填充它(例如,迭代你的边缘并指定每种颜色)。然后让Transformer返回
edgeColor.get(graphEdge)
(2)如果你真的不在乎颜色的使用顺序,或者你偶尔会重复,那么你可以得到边缘的hashCode,将其修改为颜色列表的长度,并返回:
palette[graphEdge.hashCode() % palette.length];
答案 1 :(得分:0)
以下是对边数进行近似的示例答案:
这也避免了为多个边缘分配相同的颜色。
Transformer<String, Paint> edgePaint = new Transformer<String, Paint>()
{
private final Color[] palette = {Color.GREEN, Color.YELLOW, Color.RED, Color.GRAY, Color.BLUE, Color.CYAN, Color.WHITE, Color.ORANGE};
int[] boolFlag = new int[palette.length];
@Override
public Paint transform(String graphEdge)
{
int colorNumber = Math.abs(graphEdge.hashCode() % palette.length);
if(boolFlag[colorNumber] != 1)
{
boolFlag[colorNumber] = 1;
return palette[colorNumber];
}
else
{
int i=0;
for(i=0; i < palette.length; i++)
if(boolFlag[i] != 1)
{
colorNumber = i;
break;
}
if( i == palette.length)
{
for(i=0; i< palette.length; i++)
boolFlag[i] =0;
}
boolFlag[colorNumber] = 1;
return palette[colorNumber];
}
}
};