2016-06-24 16 views
0

グラフの対数スケールを使用しています。他のすべてのカーブの上に重ねて表示すると個々のカーブを少し広げることができます。値も。以下はJavaFxグラフは、ホバー上のカーブ全体をハイライト表示します

enter image description here

より良い私は(編集済みの機密データを)何をしたいかを示す絵このことも可能のようなものはありますか?もしそうなら、私はこれを達成するためにどのような方向に移行すべきですか?

答えて

1

グラフ上のSeriesを表すNodePath)を変更することで、マウスが曲線上を移動したときに視覚的な変化を適用する最初のケースが可能です。あなたはPathが、それは、暗く広い作りとマウスが入ったときに前に持って来るとマウスが


視覚的な変更を適用している第二の、離れたときにそれらを元に戻すのストロークに変更を適用することができます凡例項目の上にホバリングすることはまだ可能ですが、はきれいではありません解決策、少なくとも以下の実装ではありません。 Nodelookupとすると、アイテムを入手してグラフィックとテキストを公開するLabelまたはLegendItemにキャストすることができます。あなたは、各シリーズを仮定2は名前があり、それが一意であることを関連付けることができ凡例テキストとシリーズ名との間String比較してIt is a bad practice to use Sun's proprietary Java classes?

:私は

はもっとここを参照してください内部APIを使用しないようにLabelを選択しました。これらの仮定は、このアプローチを制限するので、可能ならば、私は


SSCCEそれを避けるだろう:

それが一意でない場合は、ストロークが

重要な名前だけでなく埋め比較することができ

public class DarkerSeriesOnHoverExample extends Application { @SuppressWarnings("unchecked") @Override public void start(Stage primaryStage) throws Exception { //LogarithmicNumberAxis source: https://stackoverflow.com/a/22424519/5556314 LineChart lineChart = new LineChart(new LogarithmicNumberAxis(1, 1000000), new NumberAxis(0, 2.25, 0.25)); lineChart.setCreateSymbols(false); //Values guessed from the screen shot ObservableList<XYChart.Data> seriesData = FXCollections.observableArrayList(new XYChart.Data(1, 2), new XYChart.Data(10, 2), new XYChart.Data(100, 2), new XYChart.Data(1000, 1.85), new XYChart.Data(10000, 1.50), new XYChart.Data(100000, 1.20), new XYChart.Data(1000000, 0.9)); ObservableList<XYChart.Data> series2Data = FXCollections.observableArrayList(new XYChart.Data(1, 2), new XYChart.Data(10, 2), new XYChart.Data(100, 2), new XYChart.Data(1000, 1.60), new XYChart.Data(10000, 1.25), new XYChart.Data(100000, 0.95), new XYChart.Data(1000000, 0.65)); ObservableList<XYChart.Data> series3Data = FXCollections.observableArrayList(new XYChart.Data(1, 2), new XYChart.Data(10, 1.85), new XYChart.Data(100, 1.55), new XYChart.Data(1000, 1), new XYChart.Data(10000, 0.65), new XYChart.Data(100000, 0.5), new XYChart.Data(1000000, 0.45)); ObservableList<XYChart.Series> displayedSeries = FXCollections.observableArrayList( new XYChart.Series("Series 1", seriesData), new XYChart.Series("Series 2", series2Data), new XYChart.Series("Series 3", series3Data)); lineChart.getData().addAll(displayedSeries); Scene scene = new Scene(lineChart, 300, 300); primaryStage.setScene(scene); primaryStage.show(); darkenSeriesOnHover(displayedSeries); //Setup for hovering on series (cleaner) darkenSeriesOnLegendHover(lineChart); //Setup both hovering on series and legend (messier) } private void darkenSeriesOnHover(List<XYChart.Series> seriesList){ for(XYChart.Series series : seriesList){ Node seriesNode = series.getNode(); //seriesNode will be null if this method is called before the scene CSS has been applied if(seriesNode != null && seriesNode instanceof Path){ Path seriesPath = (Path) seriesNode; Color initialStrokeColor = (Color)seriesPath.getStroke(); double initialStrokeWidth = seriesPath.getStrokeWidth(); seriesPath.setOnMouseEntered(event -> { updatePath(seriesPath, initialStrokeColor.darker(), initialStrokeWidth*2, true); }); seriesPath.setOnMouseExited(event -> { //Reset updatePath(seriesPath, initialStrokeColor, initialStrokeWidth, false); }); } } } private void darkenSeriesOnLegendHover(LineChart lineChart){ Set<Node> legendItems = lineChart.lookupAll("Label.chart-legend-item"); List<XYChart.Series> seriesList = lineChart.getData(); //Will be empty if this method is called before the scene CSS has been applied if(legendItems.isEmpty()){ return; } for(Node legendItem : legendItems){ Label legend = (Label) legendItem; XYChart.Series matchingSeries = getMatchingSeriesByName(seriesList, legend.getText()); if(matchingSeries == null){ return; } Node seriesNode = matchingSeries.getNode(); //seriesNode will be null if this method is called before the scene CSS has been applied if(seriesNode != null && seriesNode instanceof Path){ Path seriesPath = (Path) seriesNode; Color initialStrokeColor = (Color)seriesPath.getStroke(); double initialStrokeWidth = seriesPath.getStrokeWidth(); legendItem.setOnMouseEntered(event -> { updatePath(seriesPath, initialStrokeColor.darker(), initialStrokeWidth*2, true); }); legendItem.setOnMouseExited(event -> { //Reset updatePath(seriesPath, initialStrokeColor, initialStrokeWidth, false); }); seriesPath.setOnMouseEntered(event -> { updatePath(seriesPath, initialStrokeColor.darker(), initialStrokeWidth*2, true); }); seriesPath.setOnMouseExited(event -> { //Reset updatePath(seriesPath, initialStrokeColor, initialStrokeWidth, false); }); } } } private void updatePath(Path seriesPath, Paint strokeColor, double strokeWidth, boolean toFront){ seriesPath.setStroke(strokeColor); seriesPath.setStrokeWidth(strokeWidth); if(!toFront){ return; } seriesPath.toFront(); } private XYChart.Series getMatchingSeriesByName(List<XYChart.Series> seriesList, String searchParam){ for (XYChart.Series series : seriesList){ if(series.getName().equals(searchParam)){ return series; } } return null; } } 

出力:

ホバー

before hover hover

対前

関連する問題