R を使ってある事象をチャートで説明したところ、なんと(社内の)担当者が R のスクリプトを理解できないということが判明し、仕方なく JavaFX で同じようなプロットを作ることになりました。R ではスマートに計算できるベクトルの計算が、Java ではうまく行かず冗長になりますが、それでもやってやれないことはないと取り掛かったのですが、思わぬところで行き詰まってしまいました。この作業では珍しくシンボルの数が多いのですが、今までのやり方では8種までしかシンボルの色などを設定できなかったのです。
下記は無事この問題が解決した後のプロット例です。
従来は下記のように CSS ファイルで、.default-color0.chart-... の太字の数字の部分を順番に 0, 1, 2, ... と増やして対応させていましたが、この方法だと 7 までしか使えません。
.default-color0.chart-series-line { ... } .default-color0.chart-line-symbol { ... } ... ... ...
参考サイト [1] によると、.default-color0.chart-... を使わずに、代わりに .series0.chart-... を使うと良いとのことです。下記のようにして 14 種類の線およびシンボルを無事表示されることができました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 | .chart-series-line { -fx-stroke- width : 1px ; -fx-effect: null; } .series 0 .chart-series-line { -fx-stroke: transparent ; } .series 0 .chart-line-symbol { -fx- background-color : #c0c0c0 , #c0c0c0 ; -fx-background-radius: 3px ; -fx- padding : 3px ; } .series 1 .chart-legend-item-symbol { -fx- background-color : #ff0000 ; -fx-background-radius: 0 ; -fx-background-insets: 0 ; -fx-shape: "M0,5 L0,7 L12,7 L12,5 Z" ; -fx-scale-shape: false; } .series 2 .chart-series-line { -fx-stroke: #ff0000 ; -fx-stroke- width : 1px ; } .series 2 .chart-line-symbol { -fx- background-color : #ff0000 , #ff0000 ; -fx-background-radius: 0px ; -fx- padding : 0px ; } .series 2 .chart-legend-item-symbol { -fx- background-color : #ff0000 ; -fx-background-radius: 0 ; -fx-background-insets: 0 ; -fx-shape: "M0,5 L0,7 L12,7 L12,5 Z" ; -fx-scale-shape: false; } .series 3 .chart-series-line { -fx-stroke: transparent ; } .series 3 .chart-line-symbol { -fx- background-color : #008080 , #008080 ; -fx-background-radius: 2px ; -fx- padding : 2px ; } .series 4 .chart-series-line { -fx-stroke: transparent ; } .series 4 .chart-line-symbol { -fx- background-color : #008080 , #008080 ; -fx-background-radius: 0 ; -fx-background-insets: 0 ; -fx-shape: "M 2 , 0 L 5 , 4 L 8 , 0 L 10 , 0 L 10 , 2 L 6 , 5 L 10 , 8 L 10 , 10 L 8 , 10 L 5 , 6 L 2 , 10 L 0 , 10 L 0 , 8 L 4 , 5 L 0 , 2 L 0 , 0 Z"; } .series 5 .chart-series-line { -fx-stroke: transparent ; } .series 5 .chart-line-symbol { -fx- background-color : #0040c0 , #0040c0 ; -fx-background-radius: 2px ; -fx- padding : 2px ; } .series 6 .chart-series-line { -fx-stroke: transparent ; } .series 6 .chart-line-symbol { -fx- background-color : #0040c0 , #0040c0 ; -fx-background-radius: 0 ; -fx-background-insets: 0 ; -fx-shape: "M 2 , 0 L 5 , 4 L 8 , 0 L 10 , 0 L 10 , 2 L 6 , 5 L 10 , 8 L 10 , 10 L 8 , 10 L 5 , 6 L 2 , 10 L 0 , 10 L 0 , 8 L 4 , 5 L 0 , 2 L 0 , 0 Z"; } .series 7 .chart-series-line { -fx-stroke: transparent ; } .series 7 .chart-line-symbol { -fx- background-color : #0000ff , #0000ff ; -fx-background-radius: 2px ; -fx- padding : 2px ; } .series 8 .chart-series-line { -fx-stroke: transparent ; } .series 8 .chart-line-symbol { -fx- background-color : #0000ff , #0000ff ; -fx-background-radius: 0 ; -fx-background-insets: 0 ; -fx-shape: "M 2 , 0 L 5 , 4 L 8 , 0 L 10 , 0 L 10 , 2 L 6 , 5 L 10 , 8 L 10 , 10 L 8 , 10 L 5 , 6 L 2 , 10 L 0 , 10 L 0 , 8 L 4 , 5 L 0 , 2 L 0 , 0 Z"; } .series 9 .chart-series-line { -fx-stroke: transparent ; } .series 9 .chart-line-symbol { -fx- background-color : #4000c0 , #4000c0 ; -fx-background-radius: 2px ; -fx- padding : 2px ; } .series 10 .chart-series-line { -fx-stroke: transparent ; } .series 10 .chart-line-symbol { -fx- background-color : #4000c0 , #4000c0 ; -fx-background-radius: 0 ; -fx-background-insets: 0 ; -fx-shape: "M 2 , 0 L 5 , 4 L 8 , 0 L 10 , 0 L 10 , 2 L 6 , 5 L 10 , 8 L 10 , 10 L 8 , 10 L 5 , 6 L 2 , 10 L 0 , 10 L 0 , 8 L 4 , 5 L 0 , 2 L 0 , 0 Z"; } .series 11 .chart-series-line { -fx-stroke: transparent ; } .series 11 .chart-line-symbol { -fx- background-color : #800080 , #800080 ; -fx-background-radius: 2px ; -fx- padding : 2px ; } .series 12 .chart-series-line { -fx-stroke: transparent ; } .series 12 .chart-line-symbol { -fx- background-color : #800080 , #800080 ; -fx-background-radius: 0 ; -fx-background-insets: 0 ; -fx-shape: "M 2 , 0 L 5 , 4 L 8 , 0 L 10 , 0 L 10 , 2 L 6 , 5 L 10 , 8 L 10 , 10 L 8 , 10 L 5 , 6 L 2 , 10 L 0 , 10 L 0 , 8 L 4 , 5 L 0 , 2 L 0 , 0 Z"; } .series 13 .chart-series-line { -fx-stroke: transparent ; } .series 13 .chart-line-symbol { -fx- background-color : #ff0000 , #ff0000 ; -fx-background-radius: 4px ; -fx- padding : 4px ; } |
JavaFX に書き直したからと言って、くだんの担当者に理解してもらえるかどうかはあやしいのですが、このことで出来なかったことが出来るようになったので良しとし、備忘録としました。
参考サイト
- java - setting more than eight colors for data series in JavaFX ScatterChart - Stack Overflow
- bitWalk's: JavaFX: LineChart を使いこなそう (3)
にほんブログ村