JFreeChart之堆叠柱形图(StackedBar)

JFreeChart之堆叠柱形图(StackedBar)

JAVA

JFreeChart

最近的项目使用有个功能需要使用到堆叠柱形图,看了项目以前的代码实现没有想要的结果。所以自己就先到官网下载了 DemoDemo里有个打包好的Jar包,直接运行看到效果,但是坑爹的是貌似没有对应的源码,所以只能根据class名称直接google了,所幸在github里找到对应的源码。
点我下载 访问密码 f62b
这是运行Demo找到想要实现的效果的大致图:

我最终想要实现的效果是这样的:

如果想要实现这个效果,可以使用

  1. 1extendedstackedbarrenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{3}",


  2. 2 NumberFormat.getPercentInstance(), new DecimalFormat("#0.0%"))); 



但是柱体的返回的值是10.1/50.1=20.2%,40.1/50.1=79.8%

这不符合预期目标,所以就去看了一下源码,在StandardCategoryItemLabelGenerator的父类AbstractCategoryItemLabelGenerator中发现有createItemArray这么一个方法:

可以发现柱体的标签值应该是由这个方法进行返回的,因此自己就对StandardCategoryItemLabelGenerator进行了继承,并重写了这个方法。
ExtendedStandardCategoryItemLabelGeneratory中增加了isPercent作为标签值是显示百分比还是仅仅格式化的判断参数,并重写了createItemArray这个方法。

此时得到的效果如图:

然而,柱体的总值还是没有格式化。再看了一下ExtendedStackedBarRenderer这个类的代码,找到了totalFormat这个属性,将其值赋为new DecimalFormat("#0.0%")。测试:

基本是想要的最终结果,下面是测试代码

  1. 1 <dependency>


  2. 2 <groupId>jfree</groupId> 

  3. 3 <artifactId>jfreechart</artifactId> 

  4. 4 <version>1.0.13</version> 

  5. 5 </dependency> 

ExtendedStackedBarRenderer

  1. 1package com.springapp.jfreechar;




  2. 3import java.awt.Color; 

  3. 4import java.awt.Font; 

  4. 5import java.awt.Graphics2D; 

  5. 6import java.awt.geom.Rectangle2D; 

  6. 7import java.text.DecimalFormat; 

  7. 8import java.text.NumberFormat; 



  8. 10import org.jfree.chart.axis.CategoryAxis; 

  9. 11import org.jfree.chart.axis.ValueAxis; 

  10. 12import org.jfree.chart.entity.CategoryItemEntity; 

  11. 13import org.jfree.chart.entity.EntityCollection; 

  12. 14import org.jfree.chart.labels.CategoryToolTipGenerator; 

  13. 15import org.jfree.chart.plot.CategoryPlot; 

  14. 16import org.jfree.chart.plot.PlotOrientation; 

  15. 17import org.jfree.chart.renderer.category.CategoryItemRendererState; 

  16. 18import org.jfree.chart.renderer.category.StackedBarRenderer; 

  17. 19import org.jfree.data.category.CategoryDataset; 

  18. 20import org.jfree.text.TextUtilities; 

  19. 21import org.jfree.ui.TextAnchor; 

  20. 22 

  21. 23public class ExtendedStackedBarRenderer extends StackedBarRenderer { 

  22. 24 

  23. 25 private static final long serialVersionUID = 1L; 

  24. 26 private boolean showPositiveTotal; 

  25. 27 private boolean showNegativeTotal; 

  26. 28 private Font totalLabelFont; 

  27. 29 private NumberFormat totalFormatter; 

  28. 30 public ExtendedStackedBarRenderer() { 

  29. 31 showPositiveTotal = true; 

  30. 32 showNegativeTotal = true; 

  31. 33 totalLabelFont = new Font("SansSerif", 1, 12); 

  32. 34 totalFormatter = new DecimalFormat("#0.0%"); 

  33. 35 } 

  34. 36 

  35. 37 /** 

  36. 38 * StackedBarRenderer 没有这个构造方法的,传入一个NumberFormat类,可以自定义实现每个柱体值显示格式 

  37. 39 * @param totalFormatter 

  38. 40 */ 

  39. 41 public ExtendedStackedBarRenderer(NumberFormat totalFormatter) { 

  40. 42 showPositiveTotal = true; 

  41. 43 showNegativeTotal = true; 

  42. 44 totalLabelFont = new Font("SansSerif", 1, 12); 

  43. 45 this.totalFormatter = totalFormatter; 

  44. 46 } 

  45. 47 

  46. 48 public NumberFormat getTotalFormatter() { 

  47. 49 return totalFormatter; 

  48. 50 } 

  49. 51 

  50. 52 public void setTotalFormatter(NumberFormat numberformat) { 

  51. 53 if (numberformat == null) { 

  52. 54 throw new IllegalArgumentException("Null format not permitted."); 

  53. 55 } else { 

  54. 56 totalFormatter = numberformat; 

  55. 57 return; 

  56. 58 } 

  57. 59 } 

  58. 60 

  59. 61 public void drawItem(Graphics2D graphics2d, CategoryItemRendererState categoryitemrendererstate, Rectangle2D rectangle2d, CategoryPlot categoryplot, CategoryAxis categoryaxis, 

  60. 62 ValueAxis valueaxis, CategoryDataset categorydataset, int i, int j, int k) { 

  61. 63 Number number = categorydataset.getValue(i, j); 

  62. 64 if (number == null) 

  63. 65 return; 

  64. 66 double d = number.doubleValue(); 

  65. 67 PlotOrientation plotorientation = categoryplot.getOrientation(); 

  66. 68 double d1 = categoryaxis.getCategoryMiddle(j, getColumnCount(), rectangle2d, categoryplot.getDomainAxisEdge()) - categoryitemrendererstate.getBarWidth() / 2D; 

  67. 69 double d2 = 0.0D; 

  68. 70 double d3 = 0.0D; 

  69. 71 for (int l = 0; l < i; l++) { 

  70. 72 Number number1 = categorydataset.getValue(l, j); 

  71. 73 if (number1 == null) 

  72. 74 continue; 

  73. 75 double d5 = number1.doubleValue(); 

  74. 76 if (d5 > 0.0D) 

  75. 77 d2 += d5; 

  76. 78 else 

  77. 79 d3 += d5; 

  78. 80 } 

  79. 81 

  80. 82 org.jfree.ui.RectangleEdge rectangleedge = categoryplot.getRangeAxisEdge(); 

  81. 83 double d4; 

  82. 84 double d6; 

  83. 85 if (d > 0.0D) { 

  84. 86 d4 = valueaxis.valueToJava2D(d2, rectangle2d, rectangleedge); 

  85. 87 d6 = valueaxis.valueToJava2D(d2 + d, rectangle2d, rectangleedge); 

  86. 88 } else { 

  87. 89 d4 = valueaxis.valueToJava2D(d3, rectangle2d, rectangleedge); 

  88. 90 d6 = valueaxis.valueToJava2D(d3 + d, rectangle2d, rectangleedge); 

  89. 91 } 

  90. 92 double d7 = Math.min(d4, d6); 

  91. 93 double d8 = Math.max(Math.abs(d6 - d4), getMinimumBarLength()); 

  92. 94 Rectangle2D.Double double1 = null; 

  93. 95 if (plotorientation == PlotOrientation.HORIZONTAL) 

  94. 96 double1 = new Rectangle2D.Double(d7, d1, d8, categoryitemrendererstate.getBarWidth()); 

  95. 97 else 

  96. 98 double1 = new Rectangle2D.Double(d1, d7, categoryitemrendererstate.getBarWidth(), d8); 

  97. 99 java.awt.Paint paint = getItemPaint(i, j); 

  98. 100 graphics2d.setPaint(paint); 

  99. 101 graphics2d.fill(double1); 

  100. 102 if (isDrawBarOutline() && categoryitemrendererstate.getBarWidth() > 3D) { 

  101. 103 graphics2d.setStroke(getItemStroke(i, j)); 

  102. 104 graphics2d.setPaint(getItemOutlinePaint(i, j)); 

  103. 105 graphics2d.draw(double1); 

  104. 106 } 

  105. 107 org.jfree.chart.labels.CategoryItemLabelGenerator categoryitemlabelgenerator = getItemLabelGenerator(i, j); 

  106. 108 if (categoryitemlabelgenerator != null && isItemLabelVisible(i, j)) 

  107. 109 drawItemLabel(graphics2d, categorydataset, i, j, categoryplot, categoryitemlabelgenerator, double1, d < 0.0D); 

  108. 110 if (d > 0.0D) { 

  109. 111 if (showPositiveTotal && isLastPositiveItem(categorydataset, i, j)) { 

  110. 112 graphics2d.setPaint(Color.black); 

  111. 113 graphics2d.setFont(totalLabelFont); 

  112. 114 double d9 = calculateSumOfPositiveValuesForCategory(categorydataset, j); 

  113. 115 float f = (float) double1.getCenterX(); 

  114. 116 float f2 = (float) double1.getMinY() - 4F; 

  115. 117 TextAnchor textanchor = TextAnchor.BOTTOM_CENTER; 

  116. 118 if (plotorientation == PlotOrientation.HORIZONTAL) { 

  117. 119 f = (float) double1.getMaxX() + 4F; 

  118. 120 f2 = (float) double1.getCenterY(); 

  119. 121 textanchor = TextAnchor.CENTER_LEFT; 

  120. 122 } 

  121. 123 TextUtilities.drawRotatedString(totalFormatter.format(d9), graphics2d, f, f2, textanchor, 0.0D, TextAnchor.CENTER); 

  122. 124 } 

  123. 125 } else if (showNegativeTotal && isLastNegativeItem(categorydataset, i, j)) { 

  124. 126 graphics2d.setPaint(Color.black); 

  125. 127 graphics2d.setFont(totalLabelFont); 

  126. 128 double d10 = calculateSumOfNegativeValuesForCategory(categorydataset, j); 

  127. 129 float f1 = (float) double1.getCenterX(); 

  128. 130 float f3 = (float) double1.getMaxY() + 4F; 

  129. 131 TextAnchor textanchor1 = TextAnchor.TOP_CENTER; 

  130. 132 if (plotorientation == PlotOrientation.HORIZONTAL) { 

  131. 133 f1 = (float) double1.getMinX() - 4F; 

  132. 134 f3 = (float) double1.getCenterY(); 

  133. 135 textanchor1 = TextAnchor.CENTER_RIGHT; 

  134. 136 } 

  135. 137 TextUtilities.drawRotatedString(totalFormatter.format(d10), graphics2d, f1, f3, textanchor1, 0.0D, TextAnchor.CENTER); 

  136. 138 } 

  137. 139 if (categoryitemrendererstate.getInfo() != null) { 

  138. 140 EntityCollection entitycollection = categoryitemrendererstate.getEntityCollection(); 

  139. 141 if (entitycollection != null) { 

  140. 142 String s = null; 

  141. 143 CategoryToolTipGenerator categorytooltipgenerator = getToolTipGenerator(i, j); 

  142. 144 if (categorytooltipgenerator != null) 

  143. 145 s = categorytooltipgenerator.generateToolTip(categorydataset, i, j); 

  144. 146 String s1 = null; 

  145. 147 if (getItemURLGenerator(i, j) != null) 

  146. 148 s1 = getItemURLGenerator(i, j).generateURL(categorydataset, i, j); 

  147. 149 CategoryItemEntity categoryitementity = new CategoryItemEntity(double1, s, s1, categorydataset, categorydataset.getRowKey(i), categorydataset.getColumnKey(j)); 

  148. 150 entitycollection.add(categoryitementity); 

  149. 151 } 

  150. 152 } 

  151. 153 } 

  152. 154 

  153. 155 private boolean isLastPositiveItem(CategoryDataset categorydataset, int i, int j) { 

  154. 156 boolean flag = true; 

  155. 157 Number number = categorydataset.getValue(i, j); 

  156. 158 if (number == null) 

  157. 159 return false; 

  158. 160 for (int k = i + 1; k < categorydataset.getRowCount(); k++) { 

  159. 161 Number number1 = categorydataset.getValue(k, j); 

  160. 162 if (number1 != null) 

  161. 163 flag = flag && number1.doubleValue() <= 0.0D; 

  162. 164 } 

  163. 165 

  164. 166 return flag; 

  165. 167 } 

  166. 168 

  167. 169 private boolean isLastNegativeItem(CategoryDataset categorydataset, int i, int j) { 

  168. 170 boolean flag = true; 

  169. 171 Number number = categorydataset.getValue(i, j); 

  170. 172 if (number == null) 

  171. 173 return false; 

  172. 174 for (int k = i + 1; k < categorydataset.getRowCount(); k++) { 

  173. 175 Number number1 = categorydataset.getValue(k, j); 

  174. 176 if (number1 != null) 

  175. 177 flag = flag && number1.doubleValue() >= 0.0D; 

  176. 178 } 

  177. 179 

  178. 180 return flag; 

  179. 181 } 

  180. 182 

  181. 183 private double calculateSumOfPositiveValuesForCategory(CategoryDataset categorydataset, int i) { 

  182. 184 double d = 0.0D; 

  183. 185 for (int j = 0; j < categorydataset.getRowCount(); j++) { 

  184. 186 Number number = categorydataset.getValue(j, i); 

  185. 187 if (number == null) 

  186. 188 continue; 

  187. 189 double d1 = number.doubleValue(); 

  188. 190 if (d1 > 0.0D) 

  189. 191 d += d1; 

  190. 192 } 

  191. 193 

  192. 194 return d; 

  193. 195 } 

  194. 196 

  195. 197 private double calculateSumOfNegativeValuesForCategory(CategoryDataset categorydataset, int i) { 

  196. 198 double d = 0.0D; 

  197. 199 for (int j = 0; j < categorydataset.getRowCount(); j++) { 

  198. 200 Number number = categorydataset.getValue(j, i); 

  199. 201 if (number == null) 

  200. 202 continue; 

  201. 203 double d1 = number.doubleValue(); 

  202. 204 if (d1 < 0.0D) 

  203. 205 d += d1; 

  204. 206 } 

  205. 207 

  206. 208 return d; 

  207. 209 } 

  208. 210 

  209. 211} 

  210. 212 

ExtendedStandardCategoryItemLabelGeneratory

  1. 1package com.springapp.jfreechar;




  2. 3import org.jfree.chart.HashUtilities; 

  3. 4import org.jfree.chart.labels.AbstractCategoryItemLabelGenerator; 

  4. 5import org.jfree.chart.labels.StandardCategoryItemLabelGenerator; 

  5. 6import org.jfree.data.DataUtilities; 

  6. 7import org.jfree.data.category.CategoryDataset; 

  7. 8import org.jfree.util.ObjectUtilities; 

  8. 9import org.jfree.util.PublicCloneable; 

  9. 10 

  10. 11import java.io.Serializable; 

  11. 12import java.text.DateFormat; 

  12. 13import java.text.MessageFormat; 

  13. 14import java.text.NumberFormat; 

  14. 15 

  15. 16public class ExtendedStandardCategoryItemLabelGeneratory extends StandardCategoryItemLabelGenerator implements PublicCloneable, Cloneable, Serializable { 

  16. 17 

  17. 18 private static final long serialVersionUID = -7108591260223293197L; 

  18. 19 private String labelFormat; 

  19. 20 private String nullValueString; 

  20. 21 private NumberFormat numberFormat; 

  21. 22 private DateFormat dateFormat; 

  22. 23 private NumberFormat percentFormat; 

  23. 24 //新增加了参数,柱体series的值是否是总值的百分比,还是仅仅将原来的小数转化为百分数 

  24. 25 private boolean isPercent = false; 

  25. 26 

  26. 27 public ExtendedStandardCategoryItemLabelGeneratory(String labelFormat, NumberFormat formatter, NumberFormat percentFormatter,boolean isPercent){ 

  27. 28 super(labelFormat, formatter, percentFormatter); 

  28. 29 if(labelFormat == null) { 

  29. 30 throw new IllegalArgumentException("Null \‘labelFormat\‘ argument."); 

  30. 31 } else if(formatter == null) { 

  31. 32 throw new IllegalArgumentException("Null \‘formatter\‘ argument."); 

  32. 33 } else if(percentFormatter == null) { 

  33. 34 throw new IllegalArgumentException("Null \‘percentFormatter\‘ argument."); 

  34. 35 } else { 

  35. 36 this.labelFormat = labelFormat; 

  36. 37 this.numberFormat = formatter; 

  37. 38 this.percentFormat = percentFormatter; 

  38. 39 this.dateFormat = null; 

  39. 40 this.nullValueString = "-"; 

  40. 41 if (isPercent) 

  41. 42 this.isPercent = isPercent; 

  42. 43 } 

  43. 44 

  44. 45 } 

  45. 46 

  46. 47 @Override 

  47. 48 protected String generateLabelString(CategoryDataset dataset, int row, int column) { 

  48. 49 if(dataset == null) { 

  49. 50 throw new IllegalArgumentException("Null \‘dataset\‘ argument."); 

  50. 51 } else { 

  51. 52 String result = null; 

  52. 53 Object[] items = this.createItemArray(dataset, row, column); 

  53. 54 result = MessageFormat.format(this.labelFormat, items); 

  54. 55 return result; 

  55. 56 } 

  56. 57 } 

  57. 58 @Override 

  58. 59 protected Object[] createItemArray(CategoryDataset dataset, int row, int column) { 

  59. 60 Object[] result = new Object[]{dataset.getRowKey(row).toString(), dataset.getColumnKey(column).toString(), null, null}; 

  60. 61 Number value = dataset.getValue(row, column); 

  61. 62 if(value != null) { 

  62. 63 if(this.numberFormat != null) { 

  63. 64 result[2] = this.numberFormat.format(value); 

  64. 65 } else if(this.dateFormat != null) { 

  65. 66 result[2] = this.dateFormat.format(value); 

  66. 67 } 

  67. 68 } else { 

  68. 69 result[2] = this.nullValueString; 

  69. 70 } 

  70. 71 

  71. 72 if(value != null) { 

  72. 73 double total = DataUtilities.calculateColumnTotal(dataset, column); 

  73. 74 // 

  74. 75 double percent = 0D;// / total; 

  75. 76 if (this.isPercent) 

  76. 77 //StandardCategoryItemLabelGenerator 返回的值是百分比 

  77. 78 percent = value.doubleValue() / total; 

  78. 79 else 

  79. 80 //返回自己原来的值 

  80. 81 percent = value.doubleValue(); 

  81. 82 //格式化 

  82. 83 result[3] = this.percentFormat.format(percent); 

  83. 84 } 

  84. 85 

  85. 86 return result; 

  86. 87 } 

  87. 88 

  88. 89 

  89. 90} 

  90. 91 

StackedBarChartDemo3

  1. 1package com.springapp.jfreechar;




  2. 3import java.awt.*; 

  3. 4import java.text.DecimalFormat; 

  4. 5import java.text.NumberFormat; 

  5. 6import java.util.Iterator; 



  6. 8import javax.swing.*; 



  7. 10import com.sun.javafx.charts.Legend; 

  8. 11import org.jfree.chart.*; 

  9. 12import org.jfree.chart.axis.*; 

  10. 13import org.jfree.chart.labels.*; 

  11. 14import org.jfree.chart.plot.CategoryPlot; 

  12. 15import org.jfree.chart.plot.PlotOrientation; 

  13. 16import org.jfree.chart.title.LegendTitle; 

  14. 17import org.jfree.data.category.CategoryDataset; 

  15. 18import org.jfree.data.category.DefaultCategoryDataset; 

  16. 19import org.jfree.ui.ApplicationFrame; 

  17. 20import org.jfree.ui.RectangleEdge; 

  18. 21import org.jfree.ui.RefineryUtilities; 

  19. 22import org.jfree.ui.TextAnchor; 

  20. 23 

  21. 24// Referenced classes of package demo: 

  22. 25// ExtendedStackedBarRenderer 

  23. 26 

  24. 27public class StackedBarChartDemo3 extends ApplicationFrame { 

  25. 28 

  26. 29 private static final long serialVersionUID = 1L; 

  27. 30 

  28. 31 public StackedBarChartDemo3(String s) { 

  29. 32 super(s); 

  30. 33 JPanel jpanel = createDemoPanel(); 

  31. 34 jpanel.setPreferredSize(new Dimension(500, 270)); 

  32. 35 setContentPane(jpanel); 

  33. 36 } 

  34. 37 

  35. 38 private static CategoryDataset createDataset() { 

  36. 39 DefaultCategoryDataset defaultcategorydataset = new DefaultCategoryDataset(); 

  37. 40 defaultcategorydataset.addValue(.101D, "Series 1", "Cross Contamination (4.3)"); 

  38. 41 defaultcategorydataset.addValue(.4D, "Series 2", "Cross Contamination (4.3)"); 

  39. 42 return defaultcategorydataset; 

  40. 43 } 

  41. 44 

  42. 45 private static JFreeChart createChart(CategoryDataset categorydataset) { 

  43. 46 

  44. 47 JFreeChart jfreechart = ChartFactory.createStackedBarChart("Stacked Bar Chart Demo 3", "Category", "Value", categorydataset, PlotOrientation.VERTICAL, true, true, false); 

  45. 48 

  46. 49 CategoryPlot categoryplot = (CategoryPlot) jfreechart.getPlot(); 

  47. 50 //柱体 

  48. 51 ExtendedStackedBarRenderer extendedstackedbarrenderer = new ExtendedStackedBarRenderer(new DecimalFormat("#0.0%")); 

  49. 52 //柱体标签是否可见 

  50. 53 extendedstackedbarrenderer.setBaseItemLabelsVisible(true); 

  51. 54 Font labelFont = new Font("Arial", Font.PLAIN, 12); 

  52. 55 extendedstackedbarrenderer.setBaseItemLabelPaint(new GradientPaint(0.0f, 0.0f, new Color(255, 255, 255), 0.0f, 0.0f, new Color(0, 0, 0))); 

  53. 56 //设置柱体标签值的格式 

  54. 57 ExtendedStandardCategoryItemLabelGeneratory generator = new ExtendedStandardCategoryItemLabelGeneratory("{3}", 

  55. 58 NumberFormat.getPercentInstance(), new DecimalFormat("#0.0%"),false); 

  56. 59 extendedstackedbarrenderer.setBaseItemLabelGenerator(generator); 

  57. 60 //自定义柱体颜色 

  58. 61 Paint p0 = new GradientPaint(0.0f, 0.0f, new Color(237, 125, 49), 0.0f, 0.0f, new Color(237, 125, 49)); 

  59. 62 extendedstackedbarrenderer.setSeriesPaint(0, p0); 

  60. 63 Paint p1 = new GradientPaint(0.0f, 0.0f, new Color(91, 155, 213), 0.0f, 0.0f, new Color(91, 155, 213)); 

  61. 64 extendedstackedbarrenderer.setSeriesPaint(1, p1); 

  62. 65 

  63. 66 categoryplot.setRenderer(extendedstackedbarrenderer); 

  64. 67 

  65. 68 //Y 轴 

  66. 69 NumberAxis numberaxis = (NumberAxis) categoryplot.getRangeAxis(); 

  67. 70 //不设置是自动显示步长 

  68. 71 numberaxis.setTickUnit(new NumberTickUnit(0.05)); 

  69. 72 numberaxis.setLowerMargin(0.14999999999999999D); 

  70. 73 numberaxis.setUpperMargin(0.14999999999999999D); 

  71. 74 //设置是否是百分率 

  72. 75 numberaxis.setNumberFormatOverride(NumberFormat.getPercentInstance()); 

  73. 76 

  74. 77 //X 辆 

  75. 78 CategoryAxis categoryAxis = categoryplot.getDomainAxis(); 

  76. 79 //x轴旋转 

  77. 80 categoryAxis.setCategoryLabelPositions(CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0)); 

  78. 81 

  79. 82 //标注 

  80. 83 LegendTitle legendtitle = (LegendTitle)jfreechart.getLegend(); 

  81. 84 legendtitle.setBorder(0, 0, 0, 0); 

  82. 85 return jfreechart; 

  83. 86 } 

  84. 87 

  85. 88 public static JPanel createDemoPanel() { 

  86. 89 JFreeChart jfreechart = createChart(createDataset()); 

  87. 90 return new ChartPanel(jfreechart); 

  88. 91 } 

  89. 92 

  90. 93 public static void main(String args[]) { 

  91. 94 StackedBarChartDemo3 stackedbarchartdemo3 = new StackedBarChartDemo3("Stacked Bar Chart Demo 3"); 

  92. 95 stackedbarchartdemo3.pack(); 

  93. 96 RefineryUtilities.centerFrameOnScreen(stackedbarchartdemo3); 

  94. 97 stackedbarchartdemo3.setVisible(true); 

  95. 98 } 

  96. 99} 

  97. 100 

  98. 101 

时间: 2024-10-10 20:00:45

JFreeChart之堆叠柱形图(StackedBar)的相关文章

XCL-Charts图表库中柱形图的同源风格切换介绍

柱形图是被使用最多的图之中的一个,在写XCL-Charts这个Android图表库时,为它花费的时间相当多,不是由于有多难绘制,而是要在设计时怎样才干保证图基类能适应各种情况,能灵活满足足够多的需求,以及够简洁的接口,并要开放出足够多的绘制元素和參数供开发者定制,同一时候对各类柱形图独有的的特点要加以突出,再加上柱形图的选项本身相对于其他图来说也是相当多的,所以花了比較多的时间.结果嘛,至少我自己临时认为还算不错. 这里我仅仅简单给大家介绍XCL-Charts图表库中柱图一个比較有意思的特点:

图表设计的介绍及指导

假如作为设计师的你,现在还不会做图表设计师的话,那么你很快要被淘汰了,今天这文章给同学们介绍图表3设计的的重要性,以及做图表的方法,技巧.希望能给与同学们帮助! 表数据,再帮你提高图表的易读性,内含大量实战案例,干货满满! 一.图表的目的和价值 图表设计是数据可视化的一个分支领域,是对数据进行二次加工,用统计图表的方式进行呈现.数据是事实或观察的结果,是对客观事物的逻辑归纳,通常一个具体的数字比一个模糊的说法更加具有可信度和说服力.但单纯的数字本身并不能提供足够的影响力,假设一个淘宝女装卖家3月

highcharts 条形图

1 /// <summary> 2 /// 获取图表chart 3 /// </summary> 4 /// <returns></returns> 5 public JsonResult GetChartInfo() 6 { 7 try 8 { 9 var maxDates = oIResearchRepository.GetEmpolderOperationInfo().OrderByDescending(c => c.DateMonth).Fir

各种信息图应用说明

  有多个元素\组合,就一定会考虑优先级,就像火箭的核心和可弃部分,如果只 能在更小的空间上展示内容,我们该留那一块呢? 综上是在工作摸索中,对数据图表在手机端应用的一点整理和提炼:每个基础图表都有自身的特点,掌握它的特质,并能利用好它做更多的创新,是可视化数据的价值所在.数据并不枯燥,有趣的数据图表是它最好的翻译官.以上观点.案例及思考难免粗浅.片面,更多更好的应用有待大家持续挖掘. 在整理例子的过程中,想到很早之前 app 之初,如何迁移 web 端或客户端业务到手机时的思路:把业务最核心的

pandas可视化:各种图的简单使用

一.Matplotlib中几种图的名字 折线图:plot 柱形图:bar 直方图:hist 箱线图:box 密度图:kde 面积图:area 散点图:scatter 散点图矩阵:scatter_matrix 饼图:pie 二.折线图:plot 平均值需要先排序后出出图 df.avg.value_counts().sort_index().plot() 三.柱形图:bar 可先做数据透视,然后生成柱形图 df.pivot_table(index='city',columns='education'

java利用JFreeChart实现各种数据统计图(柱形图,饼图,折线图)

最近在做数据挖掘的课程设计,需要将数据分析的结果很直观的展现给用户,这就要用到数据统计图,要实现这个功能就需要几个第三方包了: 1.       jfreechart-1.0.13.jar 2.       jcommon-1.0.16.jar 3.       gnujaxp.jar 先来看一下,最终效果图: 主要是jfreechart-1.0.13.jar,但这三个包要齐全,我已经将所有与jfreechart有关的jar包与本文实例的工程(代码)一同压缩上传了,有兴趣的同学可以下载, 下载地

Highcharts 3D柱形图;Highcharts 堆叠3D柱形图;Highcharts 3D饼图;Highcharts 3D圆环图

Highcharts 3D柱形图 配置 chart.options3d 配置 以下列出了 3D 图的基本配置,设置 chart 的 type 属性为 column,options3d 选项可设置三维效果. var chart = { type: 'column', options3d: { enabled: true, //显示图表是否设置为3D, 我们将其设置为 true alpha: 15, //图表视图旋转角度 beta: 15, //图表视图旋转角度 depth: 50, //图表的合计

jfreechart和springMVC+maven整合

高校的项目中一个功能是对统计的成绩进行图表分析,查找了一些资料之后感觉jfreechar上手挺快的,简单的做了几个demo也都很好实现,也能够满足项目中的需求,所以就决定使用这个工具.这里就将学习到的一些关于jfreechar的知识整理一下. 1.    引入jar包 使用这个工具一定要将他的包引入的到项目,在高校的项目中使采用maven管理这些外部文件的,所以对于引入jar包这一步就变得特别简单了,只要在maven项目的pom.xml文件中添加jfreechar的依赖就可以(maven会自动在

利用JFreeChart绘制股票K线图完整解决方案

http://blog.sina.com.cn/s/blog_4ad042e50100q7d9.html 利用JFreeChart绘制股票K线图完整解决方案 (2011-04-30 13:27:17) 标签: 绘制 股票 k线 it 分类: 软件_Software 因为工作的需要,接触了一些股票图形绘制类的工作,其中最主要的还是股票K线图的绘制了,如果利用编程语言最底层的图形绘制方法去绘制这类图形,如果对编程语言不是特别熟悉的话,一般是有很大的困难的,通过在网上搜索发现,以自己最熟悉的两门语言为