我是D3的新手,我正在尝试创建一个交互式网络可视化.我复制了这个例子的大部分内容,但是我已经使用SVG"行"而不是"路径"将曲线更改为直线,并且我还根据它们所代表的数据来缩放节点.问题是我的箭头(用SVG标记创建)位于线的末端.由于某些节点很大,箭头会隐藏在它们后面.我希望我的箭头显示在他们指向的节点的外边缘.
以下是我创建标记和链接的方法:
svg.append("svg:defs").selectAll("marker")
.data(["prereq", "coreq"])
.enter().append("svg:marker")
.attr("id", String)
.attr("viewBox", "0 -5 10 10")
.attr("refX", 15)
.attr("markerWidth", 6)
.attr("markerHeight", 6)
.attr("orient", "auto")
.append("svg:path")
.attr("d", "M0,-5L10,0L0,5");
var link = svg.selectAll(".link")
.data(force.links())
.enter().append("line")
.attr("class", "link")
.attr("marker-end", function(d) { return "url(#" + d.type + ")"; });
Run Code Online (Sandbox Code Playgroud)
我注意到"refX"属性指定了箭头应该显示的行尾的距离.我怎样才能使它依赖于它所指向的节点的半径?如果我不能这样做,我可以改为改变行本身的端点吗?我猜我会在这个函数中做到这一点,当一切都移动时,它会重置行的端点:
function tick() {
link
.attr("x1", function(d) { return d.source.x; })
.attr("y1", function(d) { return d.source.y; })
.attr("x2", function(d) { return d.target.x; })
.attr("y2", function(d) { return d.target.y; });
circle.attr("transform", function(d) {
return "translate(" + d.x …Run Code Online (Sandbox Code Playgroud) 我是D3.js的初学者,致力于网络可视化,我无法弄清楚如何正确指定力布局的链接.问题是默认情况下,d3将链接的"源"和"目标"解释为"节点"数组中节点的索引.但是,在我的数据中,源和目标引用节点的id号,我将其存储在节点属性中.如何获取指向的链接node.id而不是node.index?这是我想我应该这样做的地方:
var nodes = data.nodes;
var edges = data.edges;
var force = d3.layout.force()
.nodes(d3.values(nodes))
.links(edges)
.size([w, h])
.linkDistance(80)
.charge(-500)
.gravity(0.2)
.on("tick", tick)
.start();
Run Code Online (Sandbox Code Playgroud)
......但我不确定我是否应该修改.nodes()零件或.links()零件.我尝试在它之前添加它:
var nodes = data.nodes;
for (var i = 0; i < nodes.length; i++) {
nodes[i].index = nodes[i].id;
console.log(i + " " + nodes[i].index + " " + nodes[i].id);
}
Run Code Online (Sandbox Code Playgroud)
...但是index当我创建力时,属性才会被覆盖.
我读了这个问题,但唯一的答案似乎有点像黑客.他们还提到了"数据键",但我找不到那些,我不知道如何合并它们,因为我实际上并没有使用这个enter()功能.
我有一个名为FrontGUI的主框架,并添加了一个侧面板.这个侧面板是一个名为FrontGUILinker的类,它扩展了JPanel,并在其上有一个按钮.当我运行程序时,按钮不会执行任何操作 - 似乎似乎没有调用ActionListener.我有其他几个具有类似设置的组件,按钮都可以使用它们 - 唯一的区别是我们可以看到它们是JFrame的扩展,它们不是FrontGUI的直接字段,而是代替下面代码中提到的maingui .这个maingui包含每个帧的Controller类,包括FrontGUIController,但FrontGUILinkerController是FrontGUIController中的一个字段.以下是我班级的概述,希望只是遗漏了无关的事情.主要的JFrame类:
public class FrontGUI extends JFrame {
public FrontGUILinker linkerPanel;
public JButton btnShowhideLinker;
public FrontGUI() {
linkerPanel = new FrontGUILinker();
contentPane.add(linkerPanel, BorderLayout.EAST);
btnShowhideLinker = new JButton("Show/Hide Linker");
contentPane.add(btnShowhideLinker);
}
}
Run Code Online (Sandbox Code Playgroud)
这是它的"控制器"类.侧面板可以显示或不显示,这是这个动作监听器所做的,这似乎工作得很好.
public class FrontGUIController {
public MAINGUI maingui;
private FrontGUI frame;
public FrontGUILinkerController linkerController;
public FrontGUIController(MAINGUI parent) {
maingui = parent;
frame = new FrontGUI();
linkerController = new FrontGUILinkerController(maingui);
//Button: Show/Hide linkerPanel
frame.btnShowhideLinker.addActionListener( new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
frame.linkerPanel.setVisible(!frame.linkerPanel.isVisible());
}});
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个 Python 脚本,用于从 ISI Web of Science 中检索有关出版物的信息。我在 GitHub 上找到了 domoritz 的 python 脚本wos.py。它使用 Suds 连接到 ISI Web of Science Web 服务。我已经将它导入到我的 python 脚本中,并按照评论中的非常简短的说明尝试了这段代码:
from wos import *
soap = WokmwsSoapClient()
results = soap.search('Hallam')
Run Code Online (Sandbox Code Playgroud)
然后我收到一个错误:
suds.WebFault: Server raised fault: 'line 1:1: unexpected token: Hallam'
Run Code Online (Sandbox Code Playgroud)
我查看了 wos.py 中的代码。这是search函数:
def search(self, query):
qparams = {
'databaseID' : 'WOS',
'userQuery' : query,
'queryLanguage' : 'en',
'editions' : [{
'collection' : 'WOS',
'edition' : 'SCI',
},{
'collection' : 'WOS',
'edition' …Run Code Online (Sandbox Code Playgroud) d3.js ×2
force-layout ×1
java ×1
macos ×1
python ×1
soap ×1
suds ×1
svg ×1
swing ×1
web-services ×1