001/* 002 * Copyright (c) 2009 The openGion Project. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 013 * either express or implied. See the License for the specific language 014 * governing permissions and limitations under the License. 015 */ 016package org.opengion.hayabusa.io; 017 018import static org.opengion.fukurou.system.HybsConst.CR ; // 6.1.0.0 (2014/12/26) 019import org.opengion.fukurou.util.ColorMap; // 6.0.2.1 (2014/09/26) 020import org.opengion.fukurou.util.HybsDateUtil; // 6.7.3.0 (2017/01/27) 021import org.opengion.hayabusa.common.HybsSystemException; 022 023import java.util.List; 024import java.util.Locale; 025import java.util.Calendar; // 6.7.3.0 (2017/01/27) 026 027import java.awt.Color; 028import java.text.SimpleDateFormat; 029 030import org.jfree.ui.RectangleEdge; 031import org.jfree.chart.JFreeChart; 032import org.jfree.chart.plot.Plot; 033import org.jfree.chart.plot.PlotOrientation; 034import org.jfree.chart.plot.CategoryPlot; 035import org.jfree.chart.renderer.category.CategoryItemRenderer; 036import org.jfree.data.category.CategoryDataset; 037import org.jfree.chart.axis.CategoryAxis; 038import org.jfree.chart.axis.CategoryLabelPositions; 039import org.jfree.chart.axis.CategoryAnchor; 040import org.jfree.chart.axis.DateAxis; // 5.6.1.0 (2013/02/01) 041import org.jfree.chart.axis.SegmentedTimeline; // 6.7.3.0 (2017/01/27) 042import org.jfree.chart.plot.DatasetRenderingOrder; 043import org.jfree.chart.plot.CategoryMarker; 044 045/** 046 * ChartCreate は、JFreeChart オブジェクトを構築するクラスです。 047 * 複数の ChartDataset オブジェクトを合成することも、ここで行っています。 048 * グラフの種類は、ChartPlot_XXX クラスで設定しています。 049 * ここでは、簡易的にオブジェクトを構築できるように、チャートタイプの指定によって、 050 * 各種作成するオブジェクトを切り替えています。 051 * 052 * @version 0.9.0 2007/06/21 053 * @author Kazuhiko Hasegawa 054 * @since JDK1.1, 055 */ 056public class ChartCreate { 057 private static final long TIME_LINE = 60 * 1000L ; // // 6.9.8.0 (2018/05/28) FindBugs 058 059 private String title ; // タイトル 060 private String chartType ; // チャートの種類 061 private String domainLabel ; // チャートの共通横軸のラベル 062 private boolean showLegend = true; // 凡例 の表示可否 063 private RectangleEdge rectEdge= RectangleEdge.BOTTOM; // 凡例の表示箇所 064 private PlotOrientation plotOri = PlotOrientation.VERTICAL; // チャートの軸表示方向 065 private Color chartBackColor ; // 背景色の設定 066 private Color plotBackColor ; // 描画領域の設定 067 private int rotationLabel ; // 横軸ラベルの傾き(1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ ) 068 // CategoryAxis系は、rotationLabel。ValueAxis系(NumberAxis,DateAxis)は、useVerticalLabels で、ラベルの表示向きを指定します。 069 private boolean useVerticalLabels ; // 5.6.4.3 (2013/05/24) 横軸ラベルの表示向き(横書き:false/縦書き:true) 070 private String domainMarker ; // 横軸のマーカーライン 071 private boolean useDomainLabel = true; // 横軸ラベルの表示有無 072 private boolean useMarkerLabel = true; // マーカーライン時の文字有無 073 private int seriesPikup = -1; // ピックアップするシリーズ番号 074 private HybsURLGenerator urlGen ; // クリッカブル・マップ 075 // 4.0.2.0 (2007/12/20) 076 private String categoryMargin ; // カテゴリマージン(0.0~1.0) 077 private String lowerMargin ; // 下方マージン(0.0~1.0) 078 private String upperMargin ; // 上方マージン(0.0~1.0) 079 private boolean isDebug ; // デバッグフラグ 080 private boolean useDomainLine ; // 4.0.3.0 (2008/01/07) 横軸のグリッド表示有無(垂直線) 081 private Color domainLineColor ; // 4.0.3.0 (2008/01/07) 横軸のグリッド線の色 082 private boolean useRangeLine = true; // 4.0.3.0 (2008/01/07) 縦軸のグリッド表示有無(水平線) 083 private Color rangeLineColor ; // 4.0.3.0 (2008/01/07) 縦軸のグリッド線の色 084 private int categorySkip = 1; // 4.0.3.0 (2008/01/07) 横軸ラベルをスキップする間隔 085 private int categoryCutNo = -1; // 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のキーブレイク 086 private int rangeSkip = -1; // 4.1.1.0 (2008/02/04) 縦軸のグリッドをスキップする間隔(初期値:-1) 087 private boolean useToolTip ; // 4.3.1.0 (2008/08/09) ツールチップスの利用 088 089 private CategoryAnchor categoryAnchor ; // 4.1.1.0 (2008/02/14) 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END) 090 091 private List<ChartDataset> chartDataset ; // チャートのデータ属性管理オブジェクトのリスト 092 093 private String dateAxisFormat = "MM/dd"; // 5.6.1.0 (2013/02/01) Time,XYTime Polt関係の時間軸を表す場合のフォーマット 094 private SegmentedTimeline timeLine ; // 6.7.3.0 (2017/01/27) Time,XYTime Polt関係の時間軸を調整する SegmentedTimeline 095 096 /** 097 * JFreeChart オブジェクトを作成します。 098 * 099 * 内部的には、ChartPlot インターフェースに基づいた Plot を構築するクラスを 100 * 呼び出して、JFreeChart の引数に設定します。 101 * 各種属性の設定も行います。 102 * 103 * @return JFreeChartオブジェクト 104 */ 105 public JFreeChart getChart() { 106 107 final ChartPlot chPlot = ChartFactory.newChartPlot( chartType ); 108 109 final Plot plot = chPlot.getPlot( this ); 110 111 // 描画領域の設定 112 if( plotBackColor != null ) { 113 plot.setBackgroundPaint( plotBackColor ); 114 } 115 116 final JFreeChart chart = new JFreeChart( title, JFreeChart.DEFAULT_TITLE_FONT, plot, showLegend ); 117 118 if( showLegend ) { 119 chart.getLegend().setPosition( rectEdge ); 120 } 121 122 // 背景色の設定 123 if( chartBackColor != null ) { 124 chart.setBackgroundPaint( chartBackColor ); 125 } 126 127 // 以降の処理では、変更イベントが発行される。 128 if( categoryAnchor != null && plot instanceof CategoryPlot ) { 129 ((CategoryPlot)plot).setDomainGridlinePosition( categoryAnchor ) ; 130 } 131 132 return chart; 133 } 134 135 /** 136 * JFreeChart オブジェクトを変更します。 137 * 138 * すでに作成済みの JFreeChart に対して、 139 * シリーズのピックアップ(seriesPikup) のみ、変更します。 140 * 使用するのは、引数の JFreeChart と seriesPikup 属性値のみです。 141 * 142 * @og.rev 3.8.9.2 (2007/07/28) シリーズ指定時の色、シェープ対応 143 * 144 * @param chart JFreeChartオブジェクト 145 * @param serNo seriesPikup 属性値 146 * 147 * @return JFreeChartオブジェクト 148 */ 149 public static JFreeChart modifying( final JFreeChart chart,final int serNo ) { 150 151 final CategoryPlot plot = chart.getCategoryPlot(); 152 153 if( plot instanceof HybsCategoryPlot ) { 154 // 以降の処理では、変更イベントは発行されない。 155 // 5.1.8.0 (2010/07/01) 実質的に使用されていないので、削除 156 ((HybsCategoryPlot)plot).setSeriesPikup( serNo ) ; 157 } 158 159 final CategoryDataset dtset = plot.getDataset(); 160 final int rowCnt = dtset.getRowCount(); // Series の個数 161 162 final CategoryItemRenderer rend = plot.getRenderer(); 163 164 if( serNo >= 0 && serNo < rowCnt ) { 165 rend.setBasePaint( Color.CYAN ); 166 rend.setSeriesPaint( serNo, Color.RED ); 167 } 168 169 return chart ; 170 } 171 172 /** 173 * CategoryPlotオブジェクトを返します。 174 * 175 * ChartCreate オブジェクト(自分自身)に設定された各種属性を元に、 176 * CategoryPlotオブジェクトを構築します。 177 * 必要な属性設定は、済んでいる状態です。 178 * ここでは、serNo、categoryAxis、plotOrientation、useDomainLine、 179 * domainLineColor、useRangeLine 、RangeLineColor 、rangeSkip 、 180 * domainMarker を設定しておきます。 181 * 182 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 183 * 184 * @return 必要な属性を設定済みのCategoryPlotオブジェクト 185 */ 186 protected HybsCategoryPlot makeCategoryPlot() { 187 final HybsCategoryPlot cPlot = new HybsCategoryPlot( seriesPikup ); 188 189 cPlot.setOrientation( plotOri ); 190 cPlot.setDatasetRenderingOrder( DatasetRenderingOrder.FORWARD ); 191 192 // ドメイン(横軸)に対する、グリッドライン(垂直線)の指定 193 cPlot.setDomainGridlinesVisible( useDomainLine ); 194 if( domainLineColor != null ) { cPlot.setDomainGridlinePaint( domainLineColor ); } 195 196 // レンジ(縦軸)に対する、グリッドライン(水平線)の指定 197 cPlot.setRangeGridlinesVisible( useRangeLine ); 198 if( rangeLineColor != null ) { cPlot.setRangeGridlinePaint( rangeLineColor ); } 199 200 // 4.1.1.0 (2008/02/04) 縦軸のグリッド線(水平線)をスキップする間隔の指定 201 cPlot.setRangeSkip( rangeSkip ); 202 203 // 横軸ドメインマーカーの設定(縦ライン) 204 if( domainMarker != null ) { 205 final CategoryMarker catMk = new CategoryMarker( domainMarker ); 206 catMk.setDrawAsLine( true ); 207 if( useMarkerLabel ) { 208 catMk.setLabel( domainMarker ); 209 } 210 cPlot.addDomainMarker( catMk ); 211 } 212 213 return cPlot ; 214 } 215 216 /** 217 * CategoryAxisオブジェクトを返します。 218 * 219 * ChartCreate オブジェクト(自分自身)に設定された各種属性を元に、 220 * CategoryAxisオブジェクトを構築します。 221 * 必要な属性設定は、済んでいる状態です。 222 * ここでは、domainLabel、categoryMargin、lowerMargin、upperMargin、 223 * useDomainLabel、rotationLabel を設定しておきます。 224 * 225 * @og.rev 4.1.1.0 (2008/02/04) 横軸ラベルの文字位置指定のカット文字数追加(categoryCutNo) 226 * 227 * @return 必要な属性を設定済みの CategoryAxisオブジェクト 228 */ 229 protected CategoryAxis makeCategoryAxis() { 230 final CategoryAxis categoryAxis = new HybsCategoryAxis( 231 domainLabel,categorySkip,categoryCutNo 232 ); 233 234 // カテゴリマージン(0.0~1.0)を指定します。 235 if( categoryMargin != null ) { 236 final double ctMargin = Double.parseDouble( categoryMargin ); 237 categoryAxis.setCategoryMargin( ctMargin ) ; // double margin 238 } 239 240 // 下方マージン(0.0~1.0)を指定します。 241 if( lowerMargin != null ) { 242 final double lwMargin = Double.parseDouble( lowerMargin ); 243 categoryAxis.setLowerMargin( lwMargin ) ; // double margin 244 } 245 246 // 上方マージン(0.0~1.0)を指定します。 247 if( upperMargin != null ) { 248 final double upMargin = Double.parseDouble( upperMargin ); 249 categoryAxis.setUpperMargin( upMargin ) ; // double margin 250 } 251 252 // チャートのカテゴリーラベルの方向を指定します。 253 if( rotationLabel > 0 ) { 254 categoryAxis.setCategoryLabelPositions( 255 CategoryLabelPositions.createUpRotationLabelPositions( 256 Math.PI / rotationLabel )); 257 } 258 else if( rotationLabel < 0 ) { 259 categoryAxis.setCategoryLabelPositions( 260 CategoryLabelPositions.createDownRotationLabelPositions( 261 Math.PI / -rotationLabel )); 262 } 263 264 // 横軸ラベルの表示有無を返します。 265 categoryAxis.setVisible( useDomainLabel ); // ドメインラベルの表示有無 266 267 if( isDebug ) { 268 System.out.println( "CategoryMargin="+categoryAxis.getCategoryMargin()); 269 System.out.println( "LowerMargin="+categoryAxis.getLowerMargin()); 270 System.out.println( "UpperMargin="+categoryAxis.getUpperMargin()); 271 } 272 273 return categoryAxis ; 274 } 275 276 /** 277 * チャートのデータ属性管理オブジェクトのリストを設定します。 278 * 279 * ChartDataset オブジェクトは、内部チャートの個々の属性を管理しています。 280 * このオブジェクト は、グラフの合成に使用できるように、内部にそれぞれの Plot や 281 * renderer に対応する情報を持っています。 282 * これらを、複数管理するときに、List 管理していますので、そのList をセットします。 283 * JFreeChart には、この複数のChartDataset から、それぞれの Plot と Dataset を 284 * 順次、追加していく必要があります。その処理は、ChartPlot インターフェースを 285 * 継承した、サブクラスで実際に行われます。 286 * 287 * @param datasetList チャートのデータ属性管理のリスト 288 */ 289 public void setDatasetList( final List<ChartDataset> datasetList ) { 290 chartDataset = datasetList; 291 292 if( chartDataset != null ) { 293 final ChartDataset firstChData = chartDataset.get(0); 294 chartType = firstChData.getChartType(); 295 } 296 } 297 298 /** 299 * チャートのデータ属性管理オブジェクトのリストを返します。 300 * 301 * @return チャートのデータ属性管理オブジェクトのリスト 302 * @see #setDatasetList( List ) 303 */ 304 protected List<ChartDataset> getDatasetList() { return chartDataset; } 305 306 /** 307 * チャートのタイトルを設定します。 308 * 309 * @param chTitle チャートのタイトル 310 */ 311 public void setTitle( final String chTitle ) { 312 title = chTitle; 313 } 314 315 /** 316 * チャートの共通横軸のラベルを設定します。 317 * 318 * @param domLabel チャートの共通横軸のラベル 319 */ 320 public void setDomainLabel( final String domLabel ) { 321 domainLabel = domLabel; 322 } 323 324 /** 325 * チャートの共通横軸のラベルを返します。 326 * 327 * @return チャートの共通横軸のラベル 328 */ 329 protected String getDomainLabel() { return domainLabel; } 330 331 /** 332 * 凡例 の表示可否を設定します。 333 * 334 * @param showLeg 凡例 の表示可否 335 */ 336 public void setShowLegend( final boolean showLeg ) { 337 showLegend = showLeg; 338 } 339 340 /** 341 * 凡例の表示箇所を設定します(TOP、BOTTOM、RIGHT、LEFT)。 342 * 343 * 表示箇所は、org.jfree.ui.RectangleEdge クラスの設定値を使用します。 344 * 指定できるのは、TOP、BOTTOM、RIGHT、LEFT で、各文字の頭一文字で 345 * 判定してます。つまり、T,B,R,L で、判定を行い、それ以外はエラーになります。 346 * 347 * @param edge 凡例の表示箇所(TOP、BOTTOM、RIGHT、LEFT) 348 */ 349 public void setRectangleEdge( final String edge ) { 350 if( edge != null && edge.length() > 0 ) { 351 final char ope = edge.charAt(0); 352 switch( ope ) { 353 case 'T' : rectEdge = RectangleEdge.TOP; break; 354 case 'B' : rectEdge = RectangleEdge.BOTTOM;break; 355 case 'R' : rectEdge = RectangleEdge.RIGHT; break; 356 case 'L' : rectEdge = RectangleEdge.LEFT; break; 357 default : 358 final String errMsg = "指定のパラメータは適用できません。[" + edge + "]" 359 + CR 360 + "TOP,BOTTOM,RIGHT,LEFT の中から、指定してください。" ; 361 throw new HybsSystemException( errMsg ); 362 } 363 } 364 } 365 366 /** 367 * チャートの軸表示方向を設定します(VERTICAL、HORIZONTAL)。 368 * 369 * 軸表示方向は、org.jfree.chart.plot.PlotOrientation クラスの設定値を使用します。 370 * 指定できるのは、VERTICAL、HORIZONTALで、各文字の頭一文字で 371 * 判定してます。つまり、V,H で、判定を行い、それ以外はエラーになります。 372 * 373 * @param orientation 凡例の表示箇所(VERTICAL、HORIZONTAL) 374 */ 375 public void setPlotOrientation( final String orientation ) { 376 if( orientation != null && orientation.length() > 0 ) { 377 final char ope = orientation.charAt(0); 378 switch( ope ) { 379 case 'V' : plotOri = PlotOrientation.VERTICAL; break; 380 case 'H' : plotOri = PlotOrientation.HORIZONTAL;break; 381 default : 382 final String errMsg = "指定のパラメータは適用できません。[" + orientation + "]" 383 + CR 384 + "VERTICAL,HORIZONTAL の中から、指定してください。" ; 385 throw new HybsSystemException( errMsg ); 386 } 387 } 388 } 389 390 /** 391 * チャートの軸表示方向を返します。 392 * 393 * org.jfree.chart.plot.PlotOrientation クラスの設定値を使用します。 394 * 395 * @return チャートの軸表示方向(VERTICAL、HORIZONTAL) 396 */ 397 protected PlotOrientation getPlotOrientation() { return plotOri; } 398 399 /** 400 * チャートの背景色を指定します。 401 * 402 * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。 403 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 404 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。 405 * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。 406 * 407 * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap 408 * 409 * @param chBackClr チャートの背景色 410 * @see java.awt.Color#BLACK 411 */ 412 public void setChartBackColor( final String chBackClr ) { 413 if( chBackClr != null && chBackClr.length() > 0 ) { 414 chartBackColor = ColorMap.getColorInstance( chBackClr ); // 6.0.2.1 (2014/09/26) StringUtil → ColorMap 415 } 416 } 417 418 /** 419 * チャートの描画領域の色を指定します。 420 * 421 * 指定文字列は、java.awt.Color クラスのstatic フィールド名で指定します。 422 * BLACK , BLUE , CYAN , DARK_GRAY , GRAY , GREEN , LIGHT_GRAY , 423 * MAGENTA , ORANGE , PINK , RED , WHITE , YELLOW , (PURPLE) が指定できます。 424 * また、#XXXXXX形式の16bitRGB表記 でも指定可能です。 425 * 426 * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap 427 * 428 * @param plBackClr チャートの描画領域色 429 * @see java.awt.Color#BLACK 430 */ 431 public void setPlotBackColor( final String plBackClr ) { 432 if( plBackClr != null && plBackClr.length() > 0 ) { 433 plotBackColor = ColorMap.getColorInstance( plBackClr ); // 6.0.2.1 (2014/09/26) StringUtil → ColorMap 434 } 435 } 436 437 /** 438 * チャートのカテゴリーラベルの方向を指定します。 439 * 440 * これは、CategoryAxis 系の横軸ラベルに対して、表示方向を指定します。 441 * ValueAxis系(NumberAxis,DateAxis)は、setUseVerticalLabels( boolean ) で 442 * true:縦/false:横 のみ指定可能です。 443 * 444 * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。 445 * この指示数に相当する値を設定します。 446 * 1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ 447 * マイナスは、下方向に回転させます。 448 * 0 を指定した場合は、何も設定しません。(初期設定のまま) 449 * 450 * @param rotLabel カテゴリーラベルの方向 451 * @see #setUseVerticalLabels( boolean ) 452 */ 453 public void setRotationLabel( final int rotLabel ) { 454 rotationLabel = rotLabel; 455 } 456 457 /** 458 * ラベルの表示向きを縦にするかどうか[false/true]を指定します(初期値:false)。 459 * 460 * これは、ValueAxis系(NumberAxis,DateAxis) 系の横軸ラベルに対して、表示方向を 461 * true:縦/false:横で、指定します。 462 * true に指定した場合で、かつ、rotationLabel が未指定(=0)の場合は、2:90度 も設定します。 463 * 464 * ChartCreate の rotationLabel は、角度を指定できましたが、NumberAxis,DateAxis では、 465 * 縦にするかどうかの指定しかできません。 466 * ここでは、true を指定するとラベルは、縦書きになります。 467 * 初期値は、false(横書き)です。 468 * 469 * @og.rev 5.6.4.3 (2013/05/24) 新規追加 470 * 471 * @param useVLavels ラベルの表示向き [false:横書き/true:縦書き] 472 * @see #setRotationLabel( int ) 473 */ 474 public void setUseVerticalLabels( final boolean useVLavels ) { 475 useVerticalLabels = useVLavels; 476 477 // useVerticalLabels=true で、rotationLabel を 2:90度 に設定しておきます。 478 if( useVerticalLabels && rotationLabel == 0 ) { rotationLabel = 2; } 479 } 480 481 /** 482 * チャートのカテゴリーラベルの方向を取得します。 483 * 484 * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。 485 * この指示数に相当する値を設定します。 486 * 1:180度 、2:90度 、3:60度 、4:45度 、6:30度 ・・・ 487 * マイナスは、した方向に回転させます。 488 * 0 を指定した場合は、何も設定しません。(初期設定のまま) 489 * 490 * @return カテゴリーラベルの方向 491 * @see #setRotationLabel( int ) 492 */ 493 protected int getRotationLabel() { return rotationLabel; } 494 495 /** 496 * チャートの横軸の値(ドメイン)に合致する位置にマーカーラインを設定します。 497 * 498 * この属性には、マーカーラインを設定する値を記述します。 499 * 500 * @param marker ドメインのマーカーライン 501 */ 502 public void setDomainMarker( final String marker ) { 503 if( marker != null && marker.length() > 0 ) { 504 domainMarker = marker; 505 } 506 } 507 508 /** 509 * 横軸ラベルのラベルを表示するかどうか[true/false]を指定します(初期値:true)。 510 * 511 * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えにくくなります。 512 * そのようなケースで、横軸のラベルそのものを表示しない場合に、false を 513 * 設定します。 514 * 初期値は、表示する(true)です。 515 * 516 * @param flag 横軸ラベルの表示有無 [true:表示する/false:表示しない] 517 */ 518 public void setUseDomainLabel( final boolean flag ) { 519 useDomainLabel = flag ; 520 } 521 522 /** 523 * 横軸ラベルの表示有無を返します。 524 * 525 * @return boolean横軸ラベルの表示有無(true:表示する/false:表示しない) 526 */ 527 protected boolean isUseDomainLabel() { return useDomainLabel; } 528 529 /** 530 * マーカーラインに、その設定値を表示するかどうか[true/false]を指定します(初期値:true)。 531 * 532 * ドメイン(横軸)が、多数存在する場合、ドメインラベルが見えない場合があります。 533 * そのようなケースで、見たい値にマーカーラインを設定し、その横に、ドメインラベル 534 * を表示する事で、ピックアップしている軸の値を容易に知ることが可能です。 535 * 初期値は、表示する(true)です。 536 * 537 * @param flag マーカーラインの設定値表示 [true:表示する/false:表示しない] 538 */ 539 public void setUseMarkerLabel( final boolean flag ) { 540 useMarkerLabel = flag ; 541 } 542 543 /** 544 * 複数シリーズのピックアップを行う場合のシリーズ番号を指定します。 545 * 546 * 複数シリーズ(検索時に複数項目を同時に検索する場合)では、チャート上に 547 * 複数のグラフが表示されますが、その中の一つをピックアップする場合に、 548 * シリーズ番号を指定します。 549 * シリーズ番号は、0 から始まる数字です。 550 * ここでは、ピックアップされたシリーズは、赤色で表示されます。 551 * それ以外は、グレー色での表示になります。 552 * (※ 本来は、ChartDataset に持つべき属性です。) 553 * 554 * @param serPikup シリーズ番号 555 */ 556 public void setSeriesPikup( final int serPikup ) { 557 seriesPikup = serPikup; 558 } 559 560 /** 561 * 横軸ラベルをスキップする間隔を指定します。 562 * 563 * 横軸ラベル(カテゴリラベル表示)する際に、スキップする間隔を指定します。 564 * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。 565 * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。 566 * 初期値は、"1" (すべて表示)です。 567 * なお、先頭から表示を開始します。 568 * 569 * 注意:これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。 570 * また、categoryCutNo が指定された場合は、categorySkip は使用されません。 571 * 572 * @param cateSkip ラベルをスキップする間隔を指定 573 * @see #setCategoryCutNo( int ) 574 */ 575 public void setCategorySkip( final int cateSkip ) { 576 categorySkip = cateSkip; 577 } 578 579 /** 580 * 横軸ラベルの文字位置指定のカット文字数を指定します。 581 * 582 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 583 * 584 * 横軸ラベル(カテゴリラベル表示)する際に、ラベルの先頭から、この指定文字数だけ 585 * カットして、表示します。 586 * その際、前回作成したカットラベルと、同一ラベルの場合は、表示しません。 587 * 例えば、データは、年月日で、年と月のみ(先頭6文字)を指定すると、 588 * 日のデータは、ラベルが表示されません。 589 * 指定される数字は、1以上の整数としてください。 590 * 初期値は、すべて表示です。 591 * 592 * 注意:これとは別に、ラベル先頭に "_" を付けた場合は、ラベルを表示しません。 593 * また、categoryCutNo が指定された場合は、categorySkip は使用されません。 594 * 595 * @param cateCutNo カット文字数 596 * @see #setCategorySkip( int ) 597 */ 598 public void setCategoryCutNo( final int cateCutNo ) { 599 if( cateCutNo > 0 ) { 600 categoryCutNo = cateCutNo; 601 } 602 } 603 604 /** 605 * 複数シリーズのピックアップを行う場合のシリーズ番号を取得します。 606 * 607 * 方向は、上方向に対して、(PI / 指示数) で求まる値に設定します。 608 * この指示数に相当する値を設定します。 609 * 0 を指定した場合は、何も設定しません。(初期設定のまま) 610 * (※ 本来は、ChartDataset に持つべき属性です。) 611 * 612 * @return シリーズ番号 613 * @see #setSeriesPikup( int ) 614 */ 615 protected int getSeriesPikup() { return seriesPikup; } 616 617 /** 618 * 縦軸のグリッド線(水平線)をスキップする間隔を指定します(初期値:-1)。 619 * 620 * 縦軸のグリッド線を表示する際に、スキップする間隔を指定します。 621 * 通常は、ラベルと同じだけのグリッド線が掛かれますが、ラベルよりも 622 * 少ない数のグリッド線(例えば、2つおき)を出す場合に、値を設定します。 623 * "1" (初期値)では、1つづつ表示(つまり、すべて表示する)します。 624 * "2" とすると、1つおきに、"3" とすると、2つおきに表示します。 625 * なお、先頭から表示を開始します。 626 * 627 * 6.0.2.0 (2014/09/19) 前回の JFreeChart のVerUpで、グリッド線の表示が 628 * 5個おきに変わったようです。設定する値を マイナスにすると、初期設定の値を 629 * 使用するように変更します。微調整は、個々にお願いします。 630 * 631 * 初期値は、"-1" (設定しない)です。 632 * 633 * @og.rev 4.1.1.0 (2008/02/04) 新規追加 634 * @og.rev 6.0.2.0 (2014/09/19) rangeSkip 属性 の初期値を、-1(設定なし)に変更 635 * 636 * @param rngSkip 縦軸のグリッド線(水平線)をスキップする間隔 637 */ 638 public void setRangeSkip( final int rngSkip ) { 639 rangeSkip = rngSkip; 640 } 641 642 /** 643 * クリッカブル・マップ用URLを指定します。 644 * 645 * 画像に、クリッカブル・マップを作成する場合の、URL を指定します。 646 * これは、画像上にエリア指定でリンク引数を作成することが可能です。 647 * URL 自身は、? 付きで固定値の引数を連結することが可能です。 648 * クリックしたエリアのカテゴリやインデックスの値(引数)は、自動的に 649 * 設定されます。(指定しない場合はチャートによって異なります) 650 * <pre> 651 * ・Pie :category、pieIndex 652 * ・XY :series、item 653 * ・Category :series、category 654 * </pre> 655 * この引数の URL の名称を変更したい場合は、URL に続けて、カンマ(,) で、 656 * 名称を記述してください。 657 * 例:link.jsp,BLOCK 658 * 659 * @param imageMapUrl クリッカブル・マップ用URL 660 */ 661 public void setImageMapUrl( final String imageMapUrl ) { 662 if( imageMapUrl != null ) { 663 urlGen = new HybsURLGenerator( imageMapUrl ); 664 } 665 } 666 667 /** 668 * クリッカブル・マップ用URLを取得します。 669 * 670 * @return クリッカブル・マップ用URL 671 * @see #setImageMapUrl( String ) 672 */ 673 protected HybsURLGenerator getURLGenerator() { return urlGen; } 674 675 /** 676 * ツールチップス利用(true)利用しない(false)のフラグを取得します。 677 * 678 * @og.rev 4.3.1.0 (2008/08/09) 新規追加 679 * @og.rev 4.9.9.9 (2009/08/07) メソッド名変更 680 * 681 * @return ツールチップス利用(true)利用しない(false)のフラグ 682 * @see #setUseToolTip( boolean ) 683 */ 684 protected boolean isUseToolTip() { return useToolTip; } 685 686 /** 687 * カテゴリマージン(0.0~1.0)を指定します。 688 * 689 * カテゴリ(グラフの横軸に相当)の表示間隔(マージン)の比率を指定します。 690 * この比率は、% ではなく、数字(double)での設定になります。 691 * 何も指定しない場合は、デフォルトで自動調整されます。 692 * 693 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 694 * 695 * @param margin カテゴリマージン(0.0~1.0) 696 */ 697 public void setCategoryMargin( final String margin ) { 698 categoryMargin = margin; 699 } 700 701 /** 702 * 下方マージン(0.0~1.0)を指定します。 703 * 704 * カテゴリ(グラフの横軸に相当)の下方側(左側)のマージンの比率を指定します。 705 * この比率は、% ではなく、数字(double)での設定になります。 706 * 何も指定しない場合は、デフォルトで自動調整されます。 707 * 708 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 709 * 710 * @param margin 下方マージン(0.0~1.0) 711 */ 712 public void setLowerMargin( final String margin ) { 713 lowerMargin = margin; 714 } 715 716 /** 717 * 上方マージン(0.0~1.0)を指定します。 718 * 719 * カテゴリ(グラフの横軸に相当)の上方側(右側)のマージンの比率を指定します。 720 * この比率は、% ではなく、数字(double)での設定になります。 721 * 何も指定しない場合は、デフォルトで自動調整されます。 722 * 723 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 724 * 725 * @param margin 上方マージン(0.0~1.0) 726 */ 727 public void setUpperMargin( final String margin ) { 728 upperMargin = margin; 729 } 730 731 /** 732 * 横軸のグリッド表示有無(垂直線)を指定します(初期値:false)。 733 * 734 * ドメイン(横軸)に対する、グリッドラインを表示するかどうか指定します。 735 * 736 * 何も指定しない場合は、表示しません。(false) 737 * 738 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 739 * 740 * @param useLine 横軸のグリッド表示有無(垂直線) 741 */ 742 public void setUseDomainLine( final boolean useLine ) { 743 useDomainLine = useLine; 744 } 745 746 /** 747 * 横軸のグリッド線の色を指定します。 748 * 749 * ドメイン(横軸)に対する、グリッドラインの表示色を指定します。 750 * 何も指定しない場合は、デフォルトで自動設定されます。 751 * 752 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 753 * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap 754 * 755 * @param color 横軸のグリッド線の色 756 */ 757 public void setDomainLineColor( final String color ) { 758 if( color != null ) { 759 domainLineColor = ColorMap.getColorInstance( color ); // 6.0.2.1 (2014/09/26) StringUtil → ColorMap 760 } 761 } 762 763 /** 764 * 縦軸のグリッド表示有無(水平線)を指定します(初期値:true)。 765 * 766 * レンジ(縦軸)に対する、グリッドラインを表示するかどうか指定します。 767 * 768 * 何も指定しない場合は、表示しません。(false) 769 * 770 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 771 * 772 * @param useLine 横軸のグリッド表示有無(垂直線) 773 */ 774 public void setUseRangeLine( final boolean useLine ) { 775 useRangeLine = useLine; 776 } 777 778 /** 779 * ツールチップスを利用(true)/利用しない(false)を指定します(初期値:false)。 780 * 781 * @og.rev 4.3.1.0 (2008/08/09) 新規追加 782 * 783 * @param toolTip ツールチップスを利用(true)/利用しない(false) 784 */ 785 public void setUseToolTip( final boolean toolTip ) { 786 useToolTip = toolTip; 787 } 788 789 /** 790 * 縦軸のグリッド線の色を指定します。 791 * 792 * レンジ(縦軸)に対する、グリッドラインの表示色を指定します。 793 * 何も指定しない場合は、デフォルトで自動設定されます。 794 * 795 * @og.rev 4.0.3.0 (2008/01/07) 新規追加 796 * @og.rev 6.0.2.1 (2014/09/26) StringUtil → ColorMap 797 * 798 * @param color 縦軸のグリッド線の色 799 */ 800 public void setRangeLineColor( final String color ) { 801 if( color != null ) { 802 rangeLineColor = ColorMap.getColorInstance( color ); // 6.0.2.1 (2014/09/26) StringUtil → ColorMap 803 } 804 } 805 806 /** 807 * 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END)を指定します。 808 * 809 * 横軸のグリッド(垂直線)を、グラフのどの位置に記述するかを指定します。 810 * 具体的な値は、CategoryAnchor オブジェクトの値になります。 811 * ここでは、文字列で(START,MIDDLE,END)を指定します。(先頭一文字で判定) 812 * 何も指定しない場合は、デフォルト(MIDDLE)です。 813 * 814 * @og.rev 4.1.1.0 (2008/02/14) 新規追加 815 * 816 * @param anchor 横軸のグリッド(垂直線)の書き出し位置(START,MIDDLE,END) 817 */ 818 public void setCategoryAnchor( final String anchor ) { 819 if( anchor != null && anchor.length() > 0 ) { 820 final char anc = anchor.charAt(0); 821 switch( anc ) { 822 case 'S' : categoryAnchor = CategoryAnchor.START; break; 823 case 'M' : categoryAnchor = CategoryAnchor.MIDDLE; break; 824 case 'E' : categoryAnchor = CategoryAnchor.END; break; 825 default : 826 final String errMsg = "指定のAnchorは適用できません。[" + anchor + "]" 827 + CR 828 + "START,MIDDLE,END の中から、指定してください。" ; 829 throw new HybsSystemException( errMsg ); 830 } 831 } 832 } 833 834 /** 835 * Time,XYTime Polt関係の時間軸を表す場合のフォーマットを指定します。 836 * 837 * TimeSeries 関連のデータを扱う場合の横軸の日付フォーマットを指定します。 838 * 日付フォーマットは、java.text.SimpleDateFormat で使われる yyyy/MM/dd HH:mm:ss 表記です。 839 * 840 * 初期値は、"MM/dd" です。 841 * 842 * @og.rev 5.6.1.0 (2013/02/01) 新規追加 843 * 844 * @param dtFormat Time,XYTime Polt関係の時間軸を表す場合のフォーマット 845 */ 846 public void setDateAxisFormat( final String dtFormat ) { 847 if( dtFormat != null && dtFormat.length() > 0 ) { 848 dateAxisFormat = dtFormat; 849 } 850 } 851 852 /** 853 * Time,XYTime Polt関係の時間軸で、SegmentedTimeline 関係の情報をセットします。 854 * 855 * segSizeは、分単位の数値です。日単位を指定する場合は、24*60 = 1440 を指定します。 856 * 0 または、何も指定しない場合は、その他の情報を使用しません。 (SegmentedTimeline を使用しません。) 857 * 858 * <pre> 859 * start time 860 * | 861 * v 862 * 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ... 863 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+... 864 * | | | | | |EE|EE| | | | | |EE|EE| | | | | |EE|EE| 865 * +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+... 866 * [_____________] [___] [_] 867 * | | | 868 * included excluded segment 869 * segments segments size 870 * [___________________] 871 * | 872 * segment group 873 * </pre> 874 * 875 * @og.rev 6.7.3.0 (2017/01/27) 新規追加 876 * 877 * @param segSize SegmentedTimelineのsegment size を、分単位で指定 878 * @param segIncluded SegmentedTimelineのincluded segments(スペース)を数値で指定 879 * @param segExcluded SegmentedTimelineのexcluded segments(EE)を数値で指定 880 * @param startTime SegmentedTimelineのStartTime(segment groupの開始位置) 881 */ 882 public void setSegmentedTimelineInfo( final int segSize , final int segIncluded , final int segExcluded , final String startTime ) { 883 if( segSize > 0 ) { 884 // 6.9.8.0 (2018/05/28) FindBugs:整数乗算の結果を long にキャストしている 885// timeLine = new SegmentedTimeline( segSize * 60 * 1000 , segIncluded , segExcluded ); 886 timeLine = new SegmentedTimeline( segSize * TIME_LINE , segIncluded , segExcluded ); 887 if( startTime != null && startTime.length() >= 8 ) { 888 final Calendar cal = HybsDateUtil.getCalendar( startTime ); 889 timeLine.setStartTime( cal.getTimeInMillis() ); 890 } 891 } 892 } 893 894 /** 895 * Time,XYTime Polt関係の時間軸を表す DateAxis オブジェクトを返します。 896 * 897 * このオブジェクトは、domainLabel で名前付けされた DateAxis で、日付フォーマットは、 898 * dateAxisFormat で DateFormat を Override しています。 899 * 初期フォーマットは、"MM/dd" です。 900 * 901 * @og.rev 5.6.1.0 (2013/02/01) 新規追加 902 * @og.rev 5.6.4.3 (2013/05/24) 横軸ラベルを90度傾ける処理を追加 903 * @og.rev 6.7.3.0 (2017/01/27) 日付軸(dateAxis)の指定で、dateSegSize,dateSegIncluded,dateSegExcluded,dateStartTime を追加します。 904 * 905 * @return DateAxisオブジェクト(Time,XYTime Polt関係の時間軸表現) 906 */ 907 protected DateAxis getDateAxis() { 908 final DateAxis daxis = new DateAxis( domainLabel ); 909 daxis.setDateFormatOverride( new SimpleDateFormat( dateAxisFormat,Locale.JAPAN ) ); 910 911 // 5.6.4.3 (2013/05/24) 時間関係の横軸は、rotationLabel ではなく、useVerticalLabels を使います。 912 if( useVerticalLabels ) { 913 daxis.setVerticalTickLabels( useVerticalLabels ); 914 } 915 916 if( timeLine != null ) { daxis.setTimeline( timeLine ); } // 6.7.3.0 (2017/01/27) 917 918 return daxis; 919 } 920 921 /** 922 * デバッグフラグを指定します。 923 * 924 * true に設定すると、チャートの状態を System.out.println します。 925 * 926 * @og.rev 4.0.2.0 (2007/12/20) 新規追加 927 * 928 * @param flag デバッグフラグ [true:デバッグ/false:通常] 929 */ 930 public void setDebug( final boolean flag ) { 931 isDebug = flag; 932 } 933}