我有多個系列數據的曲線數據:選擇一系列要顯示
我希望能夠挑選我想要顯示的系列。例如,只有0°
和20°
。有沒有簡單的方法來通過操縱圖表而不使用JCheckBox
來做到這一點?我希望能夠做到這一點,例如,通過點擊系列的圖例。
我有多個系列數據的曲線數據:選擇一系列要顯示
我希望能夠挑選我想要顯示的系列。例如,只有0°
和20°
。有沒有簡單的方法來通過操縱圖表而不使用JCheckBox
來做到這一點?我希望能夠做到這一點,例如,通過點擊系列的圖例。
如圖所示here,JCheckBox
更靈活,但直接點擊圖表可能會更方便。下面的示例添加了一個ChartMouseListener
,當點擊該系列中的XYItemEntity
或其LegendItemEntity
時,系列將不可見。當然,一個系列是不可見的,它不能再被點擊;你需要一種方法來恢復可視性。在一些替代方案中,第一個如下所示:
在單擊圖表中的其他位置時恢復所有系列的可見性。
將此與上面引用的方法相結合,相應地在執行chartMouseClicked()
時切換JCheckBox
。
在按鈕處理函數中循環遍歷系列,恢復每個系列的可見性。
import java.awt.Dimension;
import java.awt.EventQueue;
import javax.swing.JFrame;
import org.jfree.chart.ChartMouseEvent;
import org.jfree.chart.ChartMouseListener;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.ChartEntity;
import org.jfree.chart.entity.LegendItemEntity;
import org.jfree.chart.entity.XYItemEntity;
import org.jfree.chart.labels.StandardXYToolTipGenerator;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;
/** @see https://stackoverflow.com/a/43286042/230513 */
public class VisibleTest {
private void display() {
JFrame f = new JFrame("Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
XYSeriesCollection dataset = new XYSeriesCollection();
for (int i = 0; i < 3; i++) {
XYSeries series = new XYSeries("value" + i);
for (double t = 0; t < 2 * Math.PI; t += 0.5) {
series.add(t, Math.sin(t) + i);
}
dataset.addSeries(series);
}
NumberAxis xAxis = new NumberAxis("domain");
NumberAxis yAxis = new NumberAxis("range");
XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer(true, true);
renderer.setBaseToolTipGenerator(new StandardXYToolTipGenerator());
XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
JFreeChart chart = new JFreeChart("Test", plot);
ChartPanel chartPanel = new ChartPanel(chart) {
@Override
public Dimension getPreferredSize() {
return new Dimension(640, 480);
}
};
chartPanel.addChartMouseListener(new ChartMouseListener() {
@Override
public void chartMouseClicked(ChartMouseEvent e) {
ChartEntity ce = e.getEntity();
if (ce instanceof XYItemEntity) {
XYItemEntity item = (XYItemEntity) ce;
renderer.setSeriesVisible(item.getSeriesIndex(), false);
} else if (ce instanceof LegendItemEntity) {
LegendItemEntity item = (LegendItemEntity) ce;
Comparable key = item.getSeriesKey();
renderer.setSeriesVisible(dataset.getSeriesIndex(key), false);
} else {
for (int i = 0; i < dataset.getSeriesCount(); i++) {
renderer.setSeriesVisible(i, true);
}
}
}
@Override
public void chartMouseMoved(ChartMouseEvent e) {}
});
f.add(chartPanel);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new VisibleTest()::display);
}
}
代碼是否適合您? 'getSeriesKey()'和'getSeriesIndex()'無法在這兩行中識別:'Comparable key = item.getSeriesKey(); renderer.setSeriesVisible(dataset.getSeriesIndex(key),false);' – pioupiou1211
是的;我只用[tag:jfreechart]版本1.0.19檢查了發佈的代碼。 – trashgod
我的不好,我的'JFreeChart'版本有問題。無論如何感謝您的回答,這正是我所期待的。我想我會結合這兩種解決方案,以獲得最佳的用戶體驗! – pioupiou1211
_label該系列_的是否意味着圖表的_legend_? – trashgod
@trashgod是的,抱歉,它不明確 – pioupiou1211