- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用 GraphStream 处理应用程序 Library .到目前为止我已经实现了Dijkstra's Shortest Path Algorithm . 我的图表工作正常,但图表的可读性不是我所期望的。这是图形的屏幕截图:
如您所见,由于大量边缘交叉,图形不可读。有什么方法可以使我的图表更具可读性。我在学习Graph Stream Generators 但我不认为它们对我来说是最好的。所以我正在寻找我的问题的准确解决方案。在上图中,图表有 70% 的可读性,但可以有更多的节点和更多的边,在那种情况下图表是完全不可读的。到目前为止,这是我的代码,供你们了解我在做什么。
public class GraphTest {
Connection conn = null;
SingleGraph graph;
Statement stmt = null;
JLabel label;
JButton show_graph;
JTextField enter_numbers;
int i = 0;
double zoomLevel = 1.0;
String result, result2;
ImageIcon loading;
public static void main(String[] args) throws ClassNotFoundException, SQLException {
GraphTest graphTest = new GraphTest();
graphTest.createConnection();
}
public GraphTest() throws SQLException {
JFrame frame = new JFrame("GRAPH");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
@SuppressWarnings("serial")
JPanel panel = new JPanel(new GridLayout()) {
@Override
public Dimension getPreferredSize() {
return new Dimension(1300, 600);
}
};
panel.setBorder(BorderFactory.createLineBorder(Color.blue, 5));
graph = new SingleGraph("Tutorial", false, true);
Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_ANOTHER_THREAD);
final ViewPanel viewPanel = viewer.addDefaultView(false);
viewer.enableAutoLayout();
graph.setAutoCreate(true);
graph.setStrict(false);
graph.addAttribute("ui.quality");
graph.addAttribute("ui.antialias");
label = new JLabel("Enter Numbers : ");
enter_numbers = new JTextField(15);
Font bigFont = enter_numbers.getFont().deriveFont(Font.PLAIN, 17f);
enter_numbers.setFont(bigFont);
show_graph = new JButton("SHOW GRAPH");
viewPanel.add(label);
viewPanel.add(enter_numbers);
viewPanel.add(show_graph);
show_graph.addActionListener(showGraphListener);
panel.add(viewPanel);
frame.add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
viewPanel.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
if (e.getWheelRotation() == -1) {
zoomLevel = zoomLevel - 0.1;
if (zoomLevel < 0.1) {
zoomLevel = 0.1;
}
viewPanel.getCamera().setViewPercent(zoomLevel);
}
if (e.getWheelRotation() == 1) {
zoomLevel = zoomLevel + 0.1;
viewPanel.getCamera().setViewPercent(zoomLevel);
}
}
});
}
private Connection createConnection() throws ClassNotFoundException, SQLException {
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:file:G:/hs_data/h2_db/test", "sa", "sa");
return conn;
}
ActionListener showGraphListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
String user_input = enter_numbers.getText();
if (user_input == null || user_input.isEmpty()) {
JOptionPane.showMessageDialog(null, "Please enter atleast two numbers with comma seperated");
} else {
ArrayList<String> items = new ArrayList<String>(Arrays.asList(user_input.split("\\s*,\\s*")));
try {
showGraph(items);
} catch (SQLException e1) {
e1.printStackTrace();
}
}
}
};
private void showGraph(ArrayList<String> items) throws SQLException {
stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT ANUMBER,BNUMBER FROM CDR LIMIT 4500");
while (rs.next()) {
result = rs.getString("ANUMBER");
result2 = rs.getString("BNUMBER");
graph.addNode(result);
graph.addNode(result2);
i++;
graph.addEdge("String" + i, result, result2);
for (Node node : graph) {
node.addAttribute("ui.hide");
}
for (Edge edge : graph.getEachEdge()) {
edge.addAttribute("ui.hide");
}
}
conn.close();
Dijkstra dijkstra = new Dijkstra(Dijkstra.Element.EDGE, null, null);
dijkstra.init(graph);
ArrayList<String> rl = new ArrayList<String>();
ArrayList<String> lr = new ArrayList<String>();
rl = items;
lr.addAll(rl);
Collections.reverse(lr);
for (String anumber : rl) {
lr.remove(lr.size() - 1);
for (String bnumber : lr) {
dijkstra.setSource(graph.getNode(anumber));
dijkstra.compute();
for (Node node : dijkstra.getPathNodes(graph.getNode(bnumber))) {
node.addAttribute("ui.style", "fill-color: blue;");
node.addAttribute("ui.label", node.getId());
node.removeAttribute("ui.hide");
}
for (Edge edge : dijkstra.getPathEdges(graph.getNode(bnumber))) {
edge.addAttribute("ui.style", "fill-color: red;");
edge.removeAttribute("ui.hide");
}
graph.getNode(anumber).addAttribute("ui.style", "fill-color: green;");
graph.getNode(anumber).addAttribute("ui.style", "size: 16px;");
graph.getNode(bnumber).addAttribute("ui.style", "fill-color: green;");
graph.getNode(bnumber).addAttribute("ui.style", "size: 16px;");
}
}
dijkstra.clear();
}
}
最佳答案
您需要试验您的Viewer
使用的布局算法。您可以通过将具体的 Layout
传递给 enableAutoLayout()
来指定布局:SpringBox
是默认设置,但 LinLog
可能值得一试。另见 list of attributes with a predefined meaning for the layout algorithms ,以及显示的示例 here和 here .
关于java - GraphStream 中更具可读性的图形 - JAVA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45344610/
我有一个功能是转换 ADO Recordset 进入html: class function RecordsetToHtml(const rs: _Recordset): WideString; 该函
经过几天的研究和讨论,我想出了这种方法来收集访客的熵(你可以看到我的研究历史here) 当用户访问时,我运行此代码: $entropy=sha1(microtime().$pepper.$_SERVE
给定一个无序列表 List ,我需要查找是否存在 String与提供的字符串匹配。 所以,我循环 for (String k : keys) { if (Utils.keysM
我已经搜索过这个问题,但没有找到我正在寻找的答案。 基本上,我想将类构造函数包装在 try/except 子句中,以便它忽略构造函数内特定类型的错误(但无论如何都会记录并打印它们)。我发现做到这一点的
我有一组三个数字,我想将一组数字与另一组数字进行比较。即,第一组中的每个数字小于另一组中的至少一个数字。需要注意的是,第一组中的下一个数字必须小于第二组中的不同数字(即,{6,1,6} 对 {8,8,
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
首先介绍一下背景: 我正在开发一个带有 EJB 模块和应用程序客户端模块的企业应用程序 (ear)。我还使用 hibernate JPA 来实现持久性,并使用 swingx 来实现 GUI。这些是唯一
我正在尝试在我的上网本上运行 Eclipse 以便能够为 Android 进行开发。 您可能已经猜到了,Eclipse 非常慢,并且不容易有效地开发。 我正在使用 Linux Ubuntu 并且我还有
for row, instrument in enumerate(instruments): for col, value in enumerate(instrument):
return not a and not b ^ 我如何以更好的格式表达它 最佳答案 DeMorgan's Law , 也许? return not (a or b) 我认为在这一点上已经足够简单了
我正在尝试让 Font Awesome 图标看起来更 slim https://jsfiddle.net/cliffeee/7L6ehw9r/1/ . 我尝试使用“-webkit-text-strok
假设我有一个名为 vals 的数据框,如下所示: id…………日期…………min_date…… .........最大日期 1…………2016/01/01…………2017/01/01…………2018/
是否有更 Pythonic 的方式来做到这一点?: if self.name2info[name]['prereqs'] is None: se
我有一个函数可以将一些文本打印到它接收到的 ostream&。如果 ostream 以终端为目标,我想让它适应终端宽度,否则默认为某个值。 我现在做的是: 从 ostream 中获取一个 ofstre
这个问题在这里已经有了答案: Should a retrieval method return 'null' or throw an exception when it can't produce
我有这个 bc = 'off' if c.page == 'blog': bc = 'on' print(bc) 有没有更 Pythonic(和/或更短)的方式在 Python 中编写? 最佳
输入:一个包含 50,000 行的 CSV;每行包含 910 列值 0/1。 输出:运行我的 CNN 的数据框。 我编写了一个逐行读取 CSV 的代码。对于每一行,我将数据分成两部分,称为神经元(90
据我所知,with block 会在您退出 block 后自动调用 close(),并且它通常用于确保不会忘记关闭一个文件。 好像没有技术上的区别 with open(file, 'r+') as f
我有一个使用 Entity Framework V6.1.1 的 MVC 5 网站。 Entity Framework DbContext 类和模型最初都在网站项目中。这个项目有 3 个 DbCont
我是编程新手,在尝试通过将 tableView 和关联 View 的创建移动到单独的类并将委托(delegate)和数据源从 VC 移动到单独的类来精简我的 ViewController 时遇到了一些
我是一名优秀的程序员,十分优秀!