如何在散点图上拖放

Posted

技术标签:

【中文标题】如何在散点图上拖放【英文标题】:How to drag'n'drop on a scatter chart 【发布时间】:2017-06-14 06:32:42 【问题描述】:

我有一个散点图,我希望能够移动点,拖动它们 问题是它不像画布,我显然不能使用eventgetX()getSceneX(),因为有轴,根据场景的大小,它们不在同一位置,所以0/0是显然没有根据图表设置,如果我改变场景的大小,距离:边框/轴也会改变

相关代码:

<ScatterChart fx:id="chart" onDragDetected="#chartDragDetected"

在.fxml中

和:

//The method associated with the chart    
@FXML
    void chartDragDetected(MouseEvent event) 
        //Lots of try to find the coordinate but they change 
        //depending of the size of the scene
    

.

//in the initialize, populating the chart
double res=0;
for (double x = fct.getInf(); x<=fct.getSup(); x+=0.05 ) //precision of graph
    res = fct.f_de_x(x);
    Data<Number,Number> dt = new Data<Number, Number>(x, res);
    series.getData().add(dt);

chart.getData().add(series);

在控制器中

【问题讨论】:

发布代码并不是为了让我们知道你已经完成了你的作业(与流行的看法相反,这实际上是一个主要针对专业程序员的网站,当然不是为了解决作业问题的人欢迎任何人在这里提问);这样我们就有了一个起点来了解您所坚持的。这个 sn-p 没有多大帮助;这个处理程序注册到哪个节点?如果是图表本身,如果您使用每个数据点的节点注册处理程序会不会更容易? @James_D 这不是我的作业,正如我每天看到的那样,来这里的不是“专业程序员”,不仅很清楚这是世界各地的人在询问他们的工作,这是一个为期 8 个月的项目,我在某一点上询问社区,约占我项目的 20% 该方法在这里调用:&lt;ScatterChart fx:id="chart" onDragDetected="#chartDragDetected" 所以在图表上是的,我不明白你的意思,在每一点上?它是 Data 我无法在此设置处理程序,我尝试过我认为 你说“我在做一个学校项目”。但我的观点不是关于项目,我的观点是关于让你发布代码的目的。请阅读帮助页面,尤其是this。将数据添加到系列后,调用data.getNode() 并将处理程序设置为返回的结果。然后可以在拖动节点时更新数据的值。 @James_D 非常感谢,这是我理解的关键,当它完全工作时,我肯定会发布一些代码作为答案,但我现在已经很近了,再次感谢跨度> 【参考方案1】:

所以,发布答案中的代码,如果它可能对某人有用的话: 在我的控制器的初始化方法中:

chart.getData().get(0).getData().forEach(data->new DnDToMoveData(data));

所以 DnDtoMoveData 是一个实习生类,它看起来像这样:

public class DnDToMoveData
    double pressPositionX;
    double pressPositionY;

    DnDToMoveData(Data<Number, Number> data)
        data.getNode().setOnMousePressed(event->
            pressPositionX = event.getSceneX();
            pressPositionY = chart.getHeight()-event.getSceneY();  
        );

        data.getNode().setOnMouseDragged(event->
            data.setXValue(data.getXValue().doubleValue()+event.getSceneX())
            this.pressPositionX);
            data.setYValue(data.getYValue().doubleValue()+event.getSceneY())-this.pressPositionY);

            pressPositionX = event.getSceneX();
            pressPositionY = chart.getHeight()-event.getSceneY();
         );
    

所以我实现了2个方法,onClick获取事件的起点,然后根据事件的位置移动点 有一些改进要做,因为事件的像素距离与图表的比例不匹配,所以它做坏事,但实际上它有效

【讨论】:

以上是关于如何在散点图上拖放的主要内容,如果未能解决你的问题,请参考以下文章

在散点图上叠加线函数 - seaborn

如何在散点图上添加贯穿原点的线(从正到负) - 高图

在散点图上绘制隐式函数(逻辑回归中的决策边界)

如何用R标记散点图上的点?

[散点图][Plotly][Python] 如何在散点图中标记心形

echart散点图问题:如何在散点图中特别标出某一个特定的点,如[120,70]