获取缩放散点图中的面积或元素
我有以下问题。我想放大散点图,然后选择所有显示的元素。
以某种方式获得放大散点图中的显示区域就足够了。从该区域的范围我可以确定哪些元素显示在该区域中,哪些不显示。
\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);
}
}
}
}
I've got the following problem. I want to zoom-in a Scatterplot and then select all the displayed elements.
It would be sufficient to somehow get the displayed area in the zoomed-in Scatterplot. From the range of this area i could determine which elements are displayed in the area and which are not.
\edit: Found the Solution (Implementing AxisChangeListener Interface)
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);
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
发布者通过让
ScatterExample
类实现AxisChangeListener< 找到了解决方案/代码> 接口。 示例已更新为版本 1.5。它还添加了一个表格来显示轴边界更改的历史记录。该图像显示了缩放、平移并单击缩放命令按钮放大的结果重置 Y。
The poster found a solution to this by having the
ScatterExample
class implement theAxisChangeListener
interface. The example has been updated to version 1.5. It also adds a table to display the history of the axis bound changes. The image shows the result of zooming, panning and clicking the zoom command buttons, Zoom In to Reset Y.