2011年7月13日 星期三

[JFreeChart] ItemLabelPosition 之研究

JFreeChart 中的 ItemLabel 位置可以有非常多樣化的選擇,但 API 又沒有詳細的說明
故整理了一下


版本 : JCommon 1.0.15, JFreeChart 1.0.13
範例使用的 Renderer : BarRenderer

使用語法範例
ItemLabelPosition ilp = new ItemLabelPosition(
ItemLabelAnchor.INSIDE1
, TextAnchor.TOP_RIGHT
);
renderer.setBasePositiveItemLabelPosition(ilp);

主要的方位是第一個參數的 ItemLabelAnchor 在決定的,它會決定一個座標點
然後再依第二個參數的 TextAnchor 來決定要用 ItemLabel 本身的哪一個地方來對齊這個座標點

ItemLabelAnchor.INSIDE1  + TextAnchor.TOP_RIGHT     : 裡面的右上方
ItemLabelAnchor.INSIDE2  + TextAnchor.TOP_RIGHT     : 裡面的右上方
ItemLabelAnchor.INSIDE3  + TextAnchor.CENTER_RIGHT  : 裡面的右方中央
ItemLabelAnchor.INSIDE4  + TextAnchor.BOTTOM_RIGHT  : 裡面的右下方
ItemLabelAnchor.INSIDE5  + TextAnchor.BOTTOM_RIGHT  : 裡面的右下方
ItemLabelAnchor.INSIDE6  + TextAnchor.BOTTOM_CENTER : 裡面的下方中央
ItemLabelAnchor.INSIDE7  + TextAnchor.BOTTOM_LEFT   : 裡面的左下方
ItemLabelAnchor.INSIDE8  + TextAnchor.BOTTOM_LEFT   : 裡面的左下方
ItemLabelAnchor.INSIDE9  + TextAnchor.CENTER_LEFT   : 裡面的左方中央
ItemLabelAnchor.INSIDE10 + TextAnchor.TOP_LEFT      : 裡面的左上方
ItemLabelAnchor.INSIDE11 + TextAnchor.TOP_LEFT      : 裡面的左上方
ItemLabelAnchor.INSIDE12 + TextAnchor.TOP_CENTER    : 裡面的上方中央

要注意, 由於用 INSIDE 時,若 ItemLabel 的文字會超出數列柱狀範圍時,字就會不見
故搭配不適當的 TextAnchor 時就會看不見 ItemLabel
故上面順便搭配了一下 TextAnchor 以供參考
上面搭配的不一定是唯一的選擇,而是要看方位來決定

看 BarRenderer 的 source code 中
目前有些 ItemLabelAnchor 的運算是一樣的
可能是其他 Renderer 才有差別
清單如下
INSIDE1 與 INSIDE2
INSIDE4 與 INSIDE5
INSIDE7 與 INSIDE8
INSIDE10 與 INSIDE11

ItemLabelAnchor.OUTSIDE1  : 右上方,再往上位移 offset
ItemLabelAnchor.OUTSIDE2  : 右上方,再往右位移 offset
ItemLabelAnchor.OUTSIDE3  : 右方中央
ItemLabelAnchor.OUTSIDE4  : 右下方,再往右位移 offset
ItemLabelAnchor.OUTSIDE5  : 右下方,再往下位移 offset
ItemLabelAnchor.OUTSIDE6  : 下方中央
ItemLabelAnchor.OUTSIDE7  : 左下方,再往下位移 offset
ItemLabelAnchor.OUTSIDE8  : 左下方,再往左位移 offset
ItemLabelAnchor.OUTSIDE9  : 左方中央
ItemLabelAnchor.OUTSIDE10 : 左上方,再往左位移 offset
ItemLabelAnchor.OUTSIDE11 : 左上方,再往上位移 offset
ItemLabelAnchor.OUTSIDE12 : 上方中央

在 BarRenderer 中有些 ItemLabelAnchor 的位置是相近的,只有些許差異
清單如下
OUTSIDE1 與 OUTSIDE2
OUTSIDE4 與 OUTSIDE5
OUTSIDE7 與 OUTSIDE8
OUTSIDE10 與 OUTSIDE11

這個些許差異是差在 ItemLabelAnchorOffset
可以用 renderer.setItemLabelAnchorOffset(double) 來設定
預設值是 2

用 OUTSIDE 再配合 TextAnchor 也可以將 ItemLabel 顯示在數列柱狀裡面
且也不會有文字不見的問題
故用 OUTSIDE 應該是比較適合大部份的需求

但是若文字超過 plot 的範圍時,仍然會被截掉或不見,這也是我一直感到頭痛的問題

沒有留言:

張貼留言

廣告訊息會被我刪除

Related Posts with Thumbnails