获取缩放散点图中的面积或元素

2023-12-29

我有以下问题。我想放大散点图,然后选择所有显示的元素。

以某种方式获得放大散点图中的显示区域就足够了。从该区域的范围我可以确定哪些元素显示在该区域中,哪些不显示。

\edit:找到解决方案(实现 AxisChangeListener 接口)

import java.awt.Color;
import java.awt.Dimension;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.event.AxisChangeEvent;
import org.jfree.chart.event.AxisChangeListener;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.ui.ApplicationFrame;
import org.jfree.ui.RefineryUtilities;
import org.jfree.chart.ChartFactory;  
import org.jfree.chart.JFreeChart; 


public class ScatterExample extends ApplicationFrame implements AxisChangeListener {
/**
 * Creates a new demo instance.
 * @param title the frame title. 
 */

private XYSeriesCollection dataset;
private JFreeChart chart;


public ScatterExample(String title) { 
    super(title);

    dataset = createSampleXYDataset();

    chart = ChartFactory.createScatterPlot(
            "Scatterplot Demo", // chart title
            "X", // domain axis label
            "Y", // range axis label
            dataset,  // data
            PlotOrientation.VERTICAL, // orientation
            true, // include legend
            true, // tooltips? 
            false // URLs?

    ); 
    //customize chart
    chart.setBackgroundPaint(Color.white); 
    XYPlot plot = chart.getXYPlot(); 
    plot.setBackgroundPaint(Color.lightGray); 
    plot.setRangeGridlinePaint(Color.white);

    plot.getRangeAxis().setRange(0.0, 10.0);
    plot.getRangeAxis().addChangeListener(this);
    plot.getDomainAxis().setRange(0.0, 10.0);
    plot.getDomainAxis().addChangeListener(this);

    ChartPanel chartPanel = new ChartPanel(chart, false); 
    chartPanel.setPreferredSize(new Dimension(500, 500)); 
    setContentPane(chartPanel); 
}

private XYSeriesCollection createSampleXYDataset() {
    XYSeriesCollection d = new XYSeriesCollection();
    XYSeries ser = new XYSeries("Series 1");
    XYSeries ser2 = new XYSeries("Series 2");

    ser.add(1.0,2.0);
    ser.add(2.0,2.0);
    ser2.add(3.0,2.0);
    ser.add(3.0,3.0);
    ser2.add(2.0,5.0);
    ser.add(1.0,2.0);
    ser.add(3.0,7.0);
    ser2.add(4.0,4.0);

    d.addSeries(ser);
    d.addSeries(ser2);

    return d;
}

/**
 * Starting point for the demonstration application. 
 * @param args ignored. 
 */

public static void main(String[] args) {
    ScatterExample demo = new ScatterExample("Scatterplot Demo"); 
    demo.pack(); 
    RefineryUtilities.centerFrameOnScreen(demo); 
    demo.setVisible(true);
}

@Override
public void axisChanged(AxisChangeEvent event) {
    if (event.getAxis().equals(chart.getXYPlot().getRangeAxis())){
        double rangeLow = chart.getXYPlot().getRangeAxis().getLowerBound();
        double rangeUp = chart.getXYPlot().getRangeAxis().getUpperBound();

        System.out.println("RangeAxis new range from "+rangeLow+" to "+rangeUp);
    }
    else {
        if (event.getAxis().equals(chart.getXYPlot().getDomainAxis())){
            double domainLow = chart.getXYPlot().getDomainAxis().getLowerBound();
            double domainUp = chart.getXYPlot().getDomainAxis().getUpperBound();

            System.out.println("DomainAxis new range from "+domainLow+" to "+domainUp);
        }
    }   
}
}

The poster found a solution to this by having the ScatterExample https://stackoverflow.com/a/41544007/230513 class implement the AxisChangeListener interface. The example https://stackoverflow.com/a/41544007/230513 has been updated to version 1.5 https://github.com/jfree/jfreechart#jfreechart. It also adds a table to display the history of the axis bound changes. The image shows the result of zooming, panning https://stackoverflow.com/a/44151032/230513 and clicking the zoom command buttons, Zoom In to Reset Y.

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Rectangle;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JToolBar;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;

import org.jfree.chart.ChartPanel;
import org.jfree.chart.event.AxisChangeEvent;
import org.jfree.chart.event.AxisChangeListener;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
import org.jfree.chart.ChartFactory;
import static org.jfree.chart.ChartPanel.*;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.Axis;
import org.jfree.chart.axis.ValueAxis;

public final class ScatterExample implements AxisChangeListener {

    private static final int N = 32; // data points per series
    private static final int R = 10; // initial axis bounds
    private final Random RANDOM = new Random();
    private ChartPanel chartPanel = new ChartPanel(null, false) {
        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }
    };
    private final DefaultTableModel model = new DefaultTableModel(
        new String[]{"Axis", "lower bound", "upper bound"}, 0) {
        @Override
        public boolean isCellEditable(int row, int column) {
            return false;
        }
    };
    private final JTable table = new JTable(model) {

        @Override
        public Class<?> getColumnClass(int column) {
            switch (column) {
                case 0:
                    return String.class;
                case 1:
                    return Double.class;
                case 2:
                    return Double.class;
                default:
                    return String.class;
            }
        }

        @Override
        public Dimension getPreferredScrollableViewportSize() {
            return new Dimension(250, 400);
        }
    };

    public static void main(String[] args) {
        EventQueue.invokeLater(new ScatterExample()::display);
    }

    private void display() {
        XYSeriesCollection dataset = createSampleXYDataset();
        JFreeChart chart = ChartFactory.createScatterPlot(
            "Scatterplot", // chart title
            "X", // domain axis label
            "Y", // range axis label
            dataset, // data
            PlotOrientation.VERTICAL, // orientation
            true, // include legend?
            true, // tooltips? 
            false // URLs?
        );
        XYPlot plot = chart.getXYPlot();
        plot.setDomainPannable(true);
        plot.getDomainAxis().setRange(-R, R);
        plot.getDomainAxis().addChangeListener(this);
        plot.setRangePannable(true);
        plot.getRangeAxis().setRange(-R, R);
        plot.getRangeAxis().addChangeListener(this);

        chartPanel.setChart(chart);
        table.setDefaultRenderer(Double.class, new DefaultTableCellRenderer() {
            {
                setHorizontalAlignment(JLabel.RIGHT);
            }
            NumberFormat f = new DecimalFormat("#.00");

            @Override
            protected void setValue(Object value) {
                setText((value == null) ? "" : f.format(value));
            }
        });

        JFrame f = new JFrame("Axis Range Example");
        f.add(chartPanel);
        f.add(createControls(), BorderLayout.SOUTH);
        f.add(new JScrollPane(table), BorderLayout.EAST);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    private XYSeriesCollection createSampleXYDataset() {
        XYSeriesCollection d = new XYSeriesCollection();
        XYSeries series1 = new XYSeries("Series 1");
        XYSeries series2 = new XYSeries("Series 2");
        for (int i = 0; i < N; i++) {
            series1.add(RANDOM.nextGaussian(), RANDOM.nextGaussian());
            series2.add(RANDOM.nextGaussian(), RANDOM.nextGaussian());
        }
        d.addSeries(series1);
        d.addSeries(series2);
        return d;
    }

    @Override
    public void axisChanged(AxisChangeEvent event) {
        Axis changed = event.getAxis();
        ValueAxis domainAxis = chartPanel.getChart().getXYPlot().getDomainAxis();
        ValueAxis rangeAxis = chartPanel.getChart().getXYPlot().getRangeAxis();
        if (changed.equals(domainAxis)) {
            double lower = domainAxis.getLowerBound();
            double upper = domainAxis.getUpperBound();
            model.addRow(new Object[]{"Domain", lower, upper});
        }
        if (changed.equals(rangeAxis)) {
            double lower = rangeAxis.getLowerBound();
            double upper = rangeAxis.getUpperBound();
            model.addRow(new Object[]{"Range", lower, upper});
        }
        int last = table.getModel().getRowCount() - 1;
        Rectangle r = table.getCellRect(last, 0, true);
        table.scrollRectToVisible(r);
    }

    // @see https://stackoverflow.com/a/41544007/230513
    private JPanel createControls() {
        JPanel panel = new JPanel();
        JToolBar toolBar = new JToolBar();
        toolBar.add(createButton("Zoom In", ZOOM_IN_BOTH_COMMAND));
        toolBar.add(createButton("Zoom In X", ZOOM_IN_DOMAIN_COMMAND));
        toolBar.add(createButton("Zoom In Y", ZOOM_IN_RANGE_COMMAND));
        toolBar.add(createButton("Zoom Out", ZOOM_OUT_BOTH_COMMAND));
        toolBar.add(createButton("Zoom Out X", ZOOM_OUT_DOMAIN_COMMAND));
        toolBar.add(createButton("Zoom Out Y", ZOOM_OUT_RANGE_COMMAND));
        toolBar.add(createButton("Reset", ZOOM_RESET_BOTH_COMMAND));
        toolBar.add(createButton("Reset X", ZOOM_RESET_DOMAIN_COMMAND));
        toolBar.add(createButton("Reset Y", ZOOM_RESET_RANGE_COMMAND));
        panel.add(toolBar);
        return panel;
    }

    private JButton createButton(String name, String command) {
        final JButton b = new JButton(name);
        b.setActionCommand(command);
        b.addActionListener(chartPanel);
        return b;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

获取缩放散点图中的面积或元素 的相关文章

  • 绘制点而不是线? JFreeChart PolarChart

    目前 PolarChart 将所有坐标与线条连接起来创建多边形 我只是希望它用点绘制每个点而不是将它们连接在一起 这可能吗 我尝试过使用translateValueThetaRadiusToJava2D 和 Graphics2D 来绘制圆圈
  • 如何使用jquery放大图像

    我只是想知道如何使用 jquery 放大图片 像这个网站这样的东西 当您单击大图像时 它会放大 您可以移动光标并在放大时查看图片的其他部分 如果有人可以向我展示链接或将我引向正确的方向 我将不胜感激 它们不会放大 真正发生的是 当您单击 缩
  • JTextField/JTextComponent 中的选择有限?

    考虑一个 JFormattedTextField 或者任何 JTextComponent 实际上 其中在字段的实际 文本 周围显示有一个前缀和一个后缀 例如 双 3 5 将是字符串 通过格式化 3 50 其周围将是前缀 和后缀 用于显示文本
  • 如何检查可见 DOM 中是否存在元素?

    如何在不使用getElementById method 我已经设置了一个现场演示 http jsbin com apawi5 3以供参考 我还将在这里打印代码
  • 如何计算贝塞尔曲线的面积?

    给定以下描述 SVG 三次贝塞尔曲线的路径 例如 M 300 140 C 300 40 500 40 500 140 并假设有一条直线连接端点300 140 to 500 140 封闭曲线下的面积 是否可以计算如此封闭的面积 谁能建议一个公
  • 使用 JavaScript/onorientationchange 重置 iPhone 上 Safari 的比例/宽度/缩放

    我根据用户使用 body 标签中的 onorientationchange 调用握持手机的方式显示不同的内容 这非常有效 我隐藏一个 div 同时使另一个 div 可见 纵向模式下的 div 在首次加载时看起来很棒 我用它来获得正确的比例
  • 如何通过xpath获取元素的索引?

    我有下一个结构 div div class column aaa div div class column bbb div div class column jjj div div 我想知道是否有一种方法可以使用 XPath 并编写一些查询
  • 如何将 XYSplineRenderer 图中的正方形形状更改为点

    In JFreeChart XYSplineRenderer Graph I need to display small dots instead of small squares to display XY coordinates How
  • Lua:“拖动”数组中的元素序列

    我正在尝试创建一个函数 将连续数量的元素 拖动 到数组中的新位置 并限制为数组的当前大小 其他项目应该围绕 拖动 的项目晃动 例如 如果我的数组有 7 个元素 并且我想拖动中间的三个 1 2 3 4 5 6 7 lt keys a b C
  • 使用 JFreeChart 散点图有没有办法细分数据集的样式?

    我正在使用 JFreeChart 渲染包含数千个数据点的散点图 我通过将合适的 XYLineAndShapeRendererper 附加到每个数据集来控制每个 ScatterPlotDataset 的外观 样式 例如 数据集 1 中的点显示
  • 确定选择哪个 JRadioButton 的最佳方法是什么?

    目前我正在以这种方式获取选定的按钮 但如果这是正确 最好的方法 我不会 也许有比这更简单或更面向对象的东西 private int getFilterType JRadioButton buttons for int i 0 n butto
  • 跳过第一个元素之后的所有其他元素[重复]

    这个问题在这里已经有答案了 我知道如何在 Java 中做到这一点 但我正在学习 Python 不知道如何做到这一点 我需要实现一个函数 该函数返回一个列表 其中包含列表中的所有其他元素 从第一个元素开始 到目前为止 我不确定如何从这里开始
  • JAVA 图表库 - JFreeChart? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 首先 我确实阅读了所有其他类似的问题 并且查看了 JFreeChart 它似乎是为 Java 桌面应用程序生成图表的首选武器 它实际上也适
  • QGraphicsScene 选择更改后为所选项目切换 QPen

    如何切换所选图形视图项目的 QPen 颜色 理想情况下 我想在图形视图或图形场景对象中处理这种颜色变化 而不是直接在主窗口选择事件中处理它 任何帮助表示赞赏 目前 当选择对象时 它会将笔颜色变为白色 我不知道如何将其转回以避免循环遍历所有对
  • 根据显示器分辨率缩放网站?

    我正在寻找一个 JavaScript 来根据浏览者的屏幕分辨率更改网站的缩放 我在桌面上制作了 1920x1080p 的网站 html moz transform scale 0 75 0 75 zoom 0 75 zoom 75 我在我的
  • Jfreechart:是否可以更改条形颜色?

    是否可以更改条形颜色 我编写了一个简单的计数程序 我还想实现一件事 如果计数大于 200 则使用蓝色绘制条形 如果没有 请使用黄色 目前 所有条形颜色均为红色 所以我想问一下 可以改变bar的颜色吗 如果是 有人可以给我一些指导来实现吗 提
  • Octave/Matlab:向向量添加新元素

    有一个向量x我必须添加一个元素 newElem 有什么区别吗 x end 1 newElem and x x newElem x end 1 newElem更稳健一些 x x newElem 仅当x是行向量 如果它是列向量x x newEl
  • Excel VBA:如何扩展给定当前选择的范围

    我想做类似的事情 E18 1 1 E18 1 1 我的目的是保留范围的选择E18 值 B 并将选择范围扩展到D16 F20 如果我有一个单元格的范围E18我想将范围扩大到D16 F20 我怎样才能做到这一点 你的意思是这样吗 SYNTAX
  • 使用 Javascript、Jquery 或 HTML5 Canvas 进行无限缩放

    我见过这个 宇宙的规模2 http htwins net scale2 我只是想知道这是否可以使用 javascript 或 jQuery 或 HTML5 Canvas 来完成 如果您单击一个项目 例如 人类 它旁边会弹出一条信息 我在这里
  • 是否可以一次显示 HTML 选择表单字段中的所有选项,而无需单击它?

    我正在使用 X Editable jQuery 就地编辑库作为任务状态选择字段 整个过程的所有阶段如下所示 单击状态 然后 它隐藏状态 SPAN 并显示隐藏的选择字段 您可以单击选择字段 使其下拉并显示所有可用选项 单击新的选择选项值 然后

随机推荐

  • 测试两条线是否相交 - JavaScript 函数

    我尝试寻找一个 javascript 函数来检测两条线是否相交 该函数将获取每条线 我们将其称为线 A 和线 B 的两个起点的 x y 值 就是如果相交则返回 true 否则返回 false 函数示例 如果答案使用矢量对象 我很高兴 Fun
  • jQuery 下拉列表更改事件不触发

    我编写 Asp Net MVC 应用程序 想要实现级联下拉列表功能 但我对 jQuery 更改事件有问题 我哪里错了 JavaScript Content jquery 1 4 1 js gt gt
  • Fabric.js 画布上的多个剪切区域

    制作照片拼贴制作器 https editphotosforfree com 我使用 Fabric js 它具有基于对象的裁剪功能 这个功能很棒 但剪切区域内的图像无法缩放 移动或旋转 我想要一个固定位置的剪切区域 并且图像可以根据用户的需要
  • Monitor.Pulse 和 Monitor.PulseAll 之间的区别

    Monitor PulseAll通知所有等待线程在队列中 Monitor Pulse通知a thread在等待队列中 下一个等待线程 只有下一个线程 一个线程 才能获取锁 那么区别是什么呢 我应该什么时候使用Pulse vs PulseAl
  • 如何登录 Google Cloud 上的 phpmyadmin

    我设置了 WordPress 1 Click Google Cloud 自动为我创建了一个用户 我没有找到 phpmyadmin 密码所在的任何地方 我怎样才能抓住它 首先 当您部署一键安装时 您需要确保选中 安装 phpMyAdmin 我
  • 使用 Android USB Host API 读取我的 USB 游戏控制器/或其他 USB 设备数据

    我正在尝试使用 Android USB Host API 读取我的 USB 游戏控制器数据 一旦我让它工作 我将连接其他设备进行测试 我的游戏控制器使用 OTG 线连接到我的 Android 手机 我现在能够获取设备 端点信息 但我不知道如
  • 配置中的属性占位符

    在 xml 上下文中使用 Spring 我们可以像这样简单地加载属性
  • r 中带有 Plot_ly 的 3D 表面,带有 x、y、z 坐标

    I am trying to use 3D surface plots to analyze the stability of outcomes as a function of inputs z is my outcome and x a
  • 如何从“带有时区的时间戳”列读取时区?

    我无法找到读取 PostgreSQL 类型列中时区值的方法带时区的时间戳 JDBC提供方法java sql ResultSet getTimestamp int java util Calendar 但我必须提供我自己的日历 我看不出有什么
  • 已弃用的 AudioManager.isWiredHeadsetOn 的替代方案?

    方法AudioManager isWiredHeadsetOn http developer android com reference android media AudioManager html isWiredHeadsetOn 28
  • 我已经成功安装了magento2但是有很多js错误

    我已经成功安装了magento2 但是有很多js错误 当通过 firebug 查看控制台日志时 它显示了很多错误 并且还有其他内容需要为 magento css 和 js 配置吗 尝试以下 使 bin magento 可执行 chmod x
  • sqlite3 - 如何使用 .databases 命令列出数据库名称?

    我是 Rails 和 SQLite 的新手 这是我的场景 我有sqlite3安装在我的 Windows Vista 计算机上 博客应用程序代码也已在以下位置实现 c rails blog 我调出命令提示符并直接进入c rails blog
  • ScrollView 内的 ForEach 不占用整个宽度

    我正在尝试使用 SwiftUI 重新创建当前应用程序的 UI 但这比我最初要困难得多 我想要实现类似卡片的单元格 背后有一些背景 我找到List至少目前还不支持这一点 List是如此有限 它不允许您移除电池分隔符 所以我搬到了ForEach
  • 检查 Jenkins 管道中是否存在插件 (Groovy)

    我想在我的管道中使用 Slack 通知插件 这非常简单 slackSend color danger message Everything broke 但是 如果 slackSend 不存在 我不希望构建中断 有没有办法先检查一下 你也许可
  • 使用 ggplot2 将每个第 N 轴标签加粗

    是否可以使用 ggplot2 将轴上的第 N 个刻度设为粗体 我只想将轴标记为粗体 小线 而不是文本 在绘图中显示每日数据时 这对于突出显示每 7 个刻度非常有用 我想保留每一天的刻度线 我无法找到有关此主题的任何内容 任何帮助将不胜感激
  • Python:将数据类型从整数更改为浮点时出现内存错误

    我有一个大小为 13000 300000 的数组 其中填充了从 0 到 255 的整数 我想将它们的数据类型从整数更改为浮点 就好像数据是 numpy 数组一样 data astype float 当将其数据类型从整数更改为浮点时 它显示内
  • Git 终端使用旧帐户将文件推送到我的新 github 帐户[重复]

    这个问题在这里已经有答案了 我最近创建了一个新的 github 帐户 当我尝试通过 git 终端将一些文件推送到我的新帐户的存储库中时 它告诉我无权访问新帐户 因此 我手动删除了之前帐户的旧凭据 并通过 git 终端保存了新凭据 现在 它将
  • ASP.NET MVC 子字符串帮助

    我有一个 ASP NET MVC 应用程序 用于显示新闻文章 对于主要段落 我有一个截断和 HTML 标签剥离器 例如 p p 这两个函数来自扩展 如下所示 public static string RemoveHTMLTags this
  • rsync 在传输过程中突然无限期挂起

    在过去的几年里 我一直在使用 rsync 单行程序将 Mac Mini 桌面 OSX 10 9 2 5 GHz i5 4 GB RAM 上的重要文件夹备份到 FreeNAS 盒子 0 7 2 Sabanda 修订版 5266 Pentium
  • 获取缩放散点图中的面积或元素

    我有以下问题 我想放大散点图 然后选择所有显示的元素 以某种方式获得放大散点图中的显示区域就足够了 从该区域的范围我可以确定哪些元素显示在该区域中 哪些不显示 edit 找到解决方案 实现 AxisChangeListener 接口 imp