如何克隆X轴和Y轴?

2023-12-23

我有一个条形图,上面有一个折线图,两个不同的系列

barChart.getData().addAll(series1); 
lineChart.getData().addAll(series2); 

我的问题:是否可以以及如何克隆 barChart 轴以获得 lineChart 的相同设置?

我想要的是完美的轴设置重叠。

Thanks

Edit:在这个链接

轴克隆法 http://docs.oracle.com/javafx/2/api/javafx/scene/chart/Axis.html

我看到有一个克隆方法继承自 java.lang.Object 类

我该如何使用这个方法?

谢谢大家

Edit2:下面是一个示例类来显示我的问题:它绘制折线图,​​并通过单击“添加系列”按钮添加散点图。

当它绘制黄点时,两个轴重叠,但只需通过单击鼠标左键向左/右或上/下移动图表并拖动图表上的任何位置,轴就会不同步。

通过单击鼠标左键并在 X 轴或 Y 轴上拖动来扩展/压缩轴,存在同样的问题

import java.util.Set;
import javafx.application.Application; 
import javafx.beans.property.SimpleDoubleProperty; 
import javafx.event.ActionEvent;
import javafx.event.EventHandler; 
import javafx.geometry.Side;
import javafx.scene.Group;
import javafx.scene.chart.NumberAxis; 
import javafx.scene.chart.XYChart; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.Node; 
import javafx.scene.chart.*; 
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.layout.StackPane;

public class RescalingSeries extends Application {

StackPane               mainGraphStackPane = null;
Button btnAdd;
BorderPane pane; 

XYChart.Series series1 = new XYChart.Series(); 

SimpleDoubleProperty rectinitX = new SimpleDoubleProperty(); 
SimpleDoubleProperty rectinitY = new SimpleDoubleProperty(); 

protected static Axis _duplicateAxis(Axis axis, Axis result) {

    result.setAnimated(axis.animatedProperty().get());
    result.setAutoRanging(axis.isAutoRanging());
    result.setLabel(axis.getLabel());
    result.setSide(axis.getSide());
    result.setTickLabelFill(axis.getTickLabelFill());
    result.setTickLabelFont(axis.getTickLabelFont());
    result.setTickLabelGap(axis.getTickLabelGap());
    result.setTickLength(axis.getTickLength());
    return result;
}

protected static ValueAxis _duplicateValueAxis(ValueAxis axis, ValueAxis result) {
    _duplicateAxis(axis, result);
    result.setLowerBound(axis.getLowerBound());
    result.setUpperBound(axis.getUpperBound());
    result.setMinorTickCount(axis.getMinorTickCount());
    result.setMinorTickLength(axis.getMinorTickLength());
    result.setTickLabelFormatter(axis.getTickLabelFormatter());
    return result;
}

/**
 * Duplicate a number axis.
 * @param axis The source axis.
 * @return A {@code NumberAxis}, never {@code null}.
 */
public static NumberAxis duplicateNumberAxis(NumberAxis axis) {
    NumberAxis result = new NumberAxis();
    _duplicateValueAxis(axis, result);
    result.setTickUnit(axis.getTickUnit());
    result.setForceZeroInRange(axis.isForceZeroInRange());
    return result;
}

/**
 * Duplicate a category axis.
 * @param axis The source axis.
 * @return A {@code CategoryAxis}, never {@code null}.
 */
public static CategoryAxis duplicateCategoryAxis(CategoryAxis axis) {
    CategoryAxis result = new CategoryAxis(axis.getCategories());
    _duplicateAxis(axis, result);
    result.setStartMargin(axis.getStartMargin());
    result.setEndMargin(axis.getEndMargin());
    result.setGapStartAndEnd(axis.gapStartAndEndProperty().get());
    return result;
}

@Override 
public void start(Stage stage) { 

final NumberAxis xAxisLC = new NumberAxis(1, 12, 1); 
final NumberAxis yAxisLC = new NumberAxis(0.53000, 0.53910, 0.0005);
yAxisLC.setSide(Side.RIGHT);

yAxisLC.setTickLabelFormatter(new NumberAxis.DefaultFormatter(yAxisLC) { 

    @Override 
    public String toString(Number object) { 
        return String.format("%7.5f", object); 
    } 
}); 

final LineChart<Number, Number> lineChart = new LineChart<>(xAxisLC, yAxisLC); 

lineChart.setCreateSymbols(false); 
lineChart.setAlternativeRowFillVisible(false); 
lineChart.setAnimated(true); 
lineChart.setLegendVisible(false);

series1.getData().add(new XYChart.Data(1, 0.53185)); 
series1.getData().add(new XYChart.Data(2, 0.532235)); 
series1.getData().add(new XYChart.Data(3, 0.53234)); 
series1.getData().add(new XYChart.Data(4, 0.538765)); 
series1.getData().add(new XYChart.Data(5, 0.53442)); 
series1.getData().add(new XYChart.Data(6, 0.534658)); 
series1.getData().add(new XYChart.Data(7, 0.53023)); 
series1.getData().add(new XYChart.Data(8, 0.53001)); 
series1.getData().add(new XYChart.Data(9, 0.53589)); 
series1.getData().add(new XYChart.Data(10, 0.53476)); 
series1.getData().add(new XYChart.Data(11, 0.530123)); 
series1.getData().add(new XYChart.Data(12, 0.531035)); 

pane = new BorderPane(); 
pane.setCenter(lineChart);
mainGraphStackPane = new StackPane();
mainGraphStackPane.getChildren().add(pane);
Scene scene = new Scene(mainGraphStackPane, 800, 600); 
lineChart.getData().addAll(series1); 

stage.setScene(scene);         

scene.setOnMouseClicked(mouseHandler); 
scene.setOnMouseDragged(mouseHandler); 
scene.setOnMouseEntered(mouseHandler); 
scene.setOnMouseExited(mouseHandler); 
scene.setOnMouseMoved(mouseHandler); 
scene.setOnMousePressed(mouseHandler); 
scene.setOnMouseReleased(mouseHandler); 

Group root = new Group();
btnAdd = new Button();
btnAdd.setText("Add serie");
root.getChildren().add(btnAdd);
pane.getChildren().add(root);              

btnAdd.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent event) {        
        NumberAxis xAxisBC = duplicateNumberAxis(xAxisLC);
        NumberAxis yAxisBC = duplicateNumberAxis(yAxisLC);
        ScatterChart<Number, Number> scatterChart = new ScatterChart<>(xAxisBC, yAxisBC); 

        scatterChart.setAlternativeRowFillVisible(false); 
        scatterChart.setAnimated(true); 
        scatterChart.setLegendVisible(false);

        XYChart.Series series2 = new XYChart.Series();

        series2.getData().add(new XYChart.Data(1, 0.53185)); 
        series2.getData().add(new XYChart.Data(2, 0.532235)); 
        series2.getData().add(new XYChart.Data(3, 0.53234)); 
        series2.getData().add(new XYChart.Data(4, 0.538765)); 
        series2.getData().add(new XYChart.Data(5, 0.53442)); 
        series2.getData().add(new XYChart.Data(6, 0.534658)); 
        series2.getData().add(new XYChart.Data(7, 0.53023)); 
        series2.getData().add(new XYChart.Data(8, 0.53001)); 
        series2.getData().add(new XYChart.Data(9, 0.53589)); 
        series2.getData().add(new XYChart.Data(10, 0.53476)); 
        series2.getData().add(new XYChart.Data(11, 0.530123)); 
        series2.getData().add(new XYChart.Data(12, 0.531035));

        scatterChart.getData().addAll(series2);

        Set<Node> chartNode = scatterChart.lookupAll(".chart-plot-background");
        for(final Node chr : chartNode){
            chr.setStyle("-fx-background-color: transparent;");                           
        }                                                
        chartNode = lineChart.lookupAll(".chart-plot-background");
        for(final Node chr : chartNode){
            chr.setStyle("-fx-background-color: transparent");                            
        }
        mainGraphStackPane.getChildren().add(scatterChart);

        xAxisBC.lowerBoundProperty().bind(xAxisLC.lowerBoundProperty());
        yAxisBC.lowerBoundProperty().bind(yAxisLC.lowerBoundProperty());      
    }
});

stage.show(); 
} 

EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 

@Override 
public void handle(MouseEvent mouseEvent) { 
    boolean XScaling=false;
    boolean YScaling=false;

   if (mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED || mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED ){ 
        LineChart<Number, Number> lineChart = (LineChart<Number, Number>) pane.getCenter(); 
        NumberAxis yAxis = (NumberAxis) lineChart.getYAxis(); 
        NumberAxis xAxis = (NumberAxis) lineChart.getXAxis(); 

        double Tgap = xAxis.getWidth()/(xAxis.getUpperBound() - xAxis.getLowerBound()); 
        double newXlower=xAxis.getLowerBound(), newXupper=xAxis.getUpperBound(); 
        double newYlower=yAxis.getLowerBound(), newYupper=yAxis.getUpperBound(); 

        double xAxisShift = xAxis.localToScene(0, 0).getX();
        double yAxisShift = yAxis.localToScene(0, 0).getY();

        double yAxisStep=yAxis.getHeight()/(yAxis.getUpperBound()-yAxis.getLowerBound());
        double CurrentPrice=yAxis.getUpperBound()-((mouseEvent.getY()-yAxisShift)/yAxisStep);

        double Delta=0.3;
        if(mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED && mouseEvent.getX()<xAxisShift+yAxis.getHeight() && mouseEvent.getY()<yAxisShift+yAxis.getHeight() && (XScaling==false || YScaling==false)){

  //==================================================== X-Axis Moving     ==================================

            if(rectinitX.get() < mouseEvent.getX()){    
                newXlower=xAxis.getLowerBound()-Delta;
                newXupper=xAxis.getUpperBound()-Delta;
            }
            else if(rectinitX.get() > mouseEvent.getX()){    
                newXlower=xAxis.getLowerBound()+Delta;
                newXupper=xAxis.getUpperBound()+Delta;
            }    
            xAxis.setLowerBound( newXlower ); 
            xAxis.setUpperBound( newXupper ); 

//===================================================== Y-Axis Moving ====================================

            if(rectinitY.get() < mouseEvent.getY()){    
                newYlower=yAxis.getLowerBound()+Delta/1000;
                newYupper=yAxis.getUpperBound()+Delta/1000;
            }
            else if(rectinitY.get() > mouseEvent.getY()){    
                newYlower=yAxis.getLowerBound()-Delta/1000;
                newYupper=yAxis.getUpperBound()-Delta/1000;
            }
            yAxis.setLowerBound(newYlower);
            yAxis.setUpperBound(newYupper);
        }

//----------------------------- Re-Scale the X-Axis when dragging below it ---------------------------------

        else if(mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED && mouseEvent.getY()>yAxisShift+yAxis.getHeight() ){
            if(rectinitX.get() < mouseEvent.getX()){    
                newXlower=xAxis.getLowerBound()+Delta;
                newXupper=xAxis.getUpperBound()-Delta;
            }
            else if(rectinitX.get() > mouseEvent.getX()){    
                newXlower=xAxis.getLowerBound()-Delta;
                newXupper=xAxis.getUpperBound()+Delta;
            }    
            xAxis.setLowerBound( newXlower ); 
            xAxis.setUpperBound( newXupper );           
        }

//--------------------------------- Re-Scale the Y-Axis when dragging to the left of it --------------------------

        else if(mouseEvent.getEventType() == MouseEvent.MOUSE_DRAGGED && mouseEvent.getX()> (xAxisShift + xAxis.getWidth())){
            if(rectinitY.get() < mouseEvent.getY()){    
                newYlower=yAxis.getLowerBound()-Delta/1000;
                newYupper=yAxis.getUpperBound()+Delta/1000;
            }
            else if(rectinitY.get() > mouseEvent.getY()){    
                newYlower=yAxis.getLowerBound()+Delta/1000;
                newYupper=yAxis.getUpperBound()-Delta/1000;
            }
            yAxis.setLowerBound(newYlower);
            yAxis.setUpperBound(newYupper);                
        }             
        rectinitX.set(mouseEvent.getX()); 
        rectinitY.set(mouseEvent.getY()); 

        if(mouseEvent.getEventType() == MouseEvent.MOUSE_MOVED && mouseEvent.getY()>yAxisShift && mouseEvent.getY()<yAxisShift+yAxis.getHeight() && mouseEvent.getX()>xAxisShift && mouseEvent.getX()<xAxisShift+xAxis.getWidth()){

        double XX=((mouseEvent.getX() - xAxisShift) / Tgap) + xAxis.getLowerBound();
        double YY=CurrentPrice;
        series1.setName(String.format("%.2g%n",XX) + ", " + String.format("%.4g%n",YY));
        }          
     } 
} 
}; 

public static void main(String[] args) { 
launch(args);  
} 
}

The

Chart, Axis, and Series

对象不可克隆。例如,我需要在两个场景中包含图表。这样做的唯一方法是从原始数据开始,并将每个元素创建两次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何克隆X轴和Y轴? 的相关文章

随机推荐

  • 如何使用 CUDA Thrust 执行策略覆盖 Thrust 的低级设备内存分配器

    我想重写低级CUDA设备内存分配器 实现为thrust system cuda detail malloc 以便它在调用时使用自定义分配器而不是直接调用cudaMalloc 主机 CPU 线程 这可能吗 如果可以的话 是否可以使用Thrus
  • 无法加载 ,因为它不在 Appbase 下

    我创建了一个NUnit http en wikipedia org wiki NUnit项目 Nunit LoginTest nunit 通过在中选择我的测试项目nunit bin目录 现在我尝试加载该项目 但它给了我以下错误 无法加载 由
  • Inno Setup:如何启动 Adob​​e Reader 并显示 PDF

    我尝试在安装结束时启动 Adob e Reader 以显示自述文件 我使用 PDF 因为我需要显示一些图像 我的 inno 安装脚本失败 并显示 无法执行文件 创建进程失败 代码 267 目录名称无效 我已经尝试过使用和不使用 Filena
  • 请解释一下这个Java正则表达式

    我没有编写以下正则表达式 我正在尝试弄清楚它的作用 我知道它必须从政策地图开始 并且政策地图和接下来的内容之间必须至少有一个空格 但我一直在试图弄清楚括号内的内容意味着什么 我知道无论是什么 它都必须在最后 policy map s x21
  • Chromedriver、Selenium - 自动下载

    我正在使用 Selenium 2 43 0 和 Python 2 7 5 在某一时刻 测试单击一个按钮 将表单信息发送到服务器 如果请求成功 服务器会返回 1 成功的消息 2 合并了表单信息的PDF 我不在乎测试 PDF 我的测试只是寻找成
  • linux ami nginx site_enabled 丢失[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我们正在尝试在 Amazon Linux AMI 上安装 nginx 来配置 uwsgi 和 django 但与 Ubuntu 不同 et
  • 在 PHP 中运行具有实时输出的进程

    我正在尝试在网页上运行一个进程 该进程将实时返回其输出 例如 如果我运行 ping 进程 它应该在每次返回新行时更新我的 页面 现在 当我使用 exec command output 时 我被迫使用 c 选项并等到进程完成才能看到输出在我的
  • Google Chrome 插件中出现“onLaunched”错误

    我正在关注 google chrome web 应用程序开发http developer chrome com trunk apps first app html http developer chrome com trunk apps f
  • ec2 实例上的 Nginx 不提供静态文件

    什么在起作用 我已在 AWS EC2 实例上启动并运行 MERN stack 仪表板 EC2 实例位于EC2 aws com React 应用程序在端口上提供服务5004 节点应用程序正在端口上运行5003 改变了什么 当我在 GoDadd
  • 使用React Router v4和react-transition-group v2动态页面滑动动画

    之前问过一个问题 如何实现页面滑动动画 使用React Router v4和react transition group v2进行页面滑动动画 https stackoverflow com questions 45932263 page
  • 如何在 JSS 中使用子选择器

    我正在尝试 JSS 看看迁移 Sass 代码库是否现实 我有一个非常基本的 CSS 样式示例 当鼠标悬停时 它会修改子节点的样式 span color red button hover span color blue
  • 输入类型=“按钮”的值未添加到数据库中

    我在添加以下值时遇到问题type button 我正在将表单元素添加到 mySql 数据库 我想知道我是否遗漏了某些内容 Edit 看起来该元素的信息没有从 html 传递到 php 因为它没有回显值 我唯一的问题是这一元素和表单的其余部分
  • 如何读取 Dapper 生成的 SQL 查询?

    我有一个标准代码 public IEnumerable ExperimentSelect object parameters using var connection new SqlConnection ConnectionString c
  • 如何将 Android 应用程序中的一条推文发布到一个特定帐户?

    我必须在我的游戏中添加一个选项 以便将高分发布到 Twitter 这个想法是 该应用程序有自己的 Twitter 帐户 用户可以通过单击按钮或菜单项将分数上传到该特定帐户 尚未决定 UI 的外观 我发现了很多这样的教程 http blog
  • msg.trim 不是函数

    msg trim 不是函数 我尝试为 android 生成 apk 文件后出现此错误 我卸载了 npm 和 ionic 并重新安装了它 但我遇到了同样的错误 请任何人都可以帮助我解决这个问题 C gt ionic v 3 16 0 Type
  • onclicklistener 在 android 中的 recyclerview 的特定项目上

    我要问一个非常基本的问题 但我被困了很长时间 在卡片视图之后有一个回收器视图 每行有 2 个图像 现在我想在图像上创建点击侦听器而不是 recyclerview 该活动 MainActivity java 对应的布局 layout main
  • jquery - 设置插件默认值?

    我正在与别人的插件交谈 而不是我自己的 我想在不触及他们的代码的情况下执行此操作 我想在单独的文件中执行此操作 我认为有一种方法可以做到这一点 例如 defaults pluginname 还是什么 这完全取决于插件及其编写方式 对于较大的
  • Azure Function 执行上下文中有多少本地磁盘可用

    Azure Function 的单次执行可使用多少本地磁盘 根据这个问题https github com Azure Azure Functions issues 179 https github com Azure Azure Funct
  • asyncio 中的链接协程(和观察者模式)

    我很难理解协程是如何链接在一起的 在一个比 hello world 或阶乘稍微不那么简单的示例中 我想要一个循环 它不断监视文件修改时间 然后在文件被触摸时打印出时间 usr bin env python3 import os import
  • 如何克隆X轴和Y轴?

    我有一个条形图 上面有一个折线图 两个不同的系列 barChart getData addAll series1 lineChart getData addAll series2 我的问题 是否可以以及如何克隆 barChart 轴以获得