I am impressed, however, that everything else worked perfectly.
Here is the graph in our current website:
Here is the graph after I upgrade to 1.0.13:
Here is a snippet of the code that generates those graphs:
Code: Select all
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.text.DecimalFormat;
import java.text.FieldPosition;
import java.util.List;
import java.util.Vector;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.intermine.objectstore.ObjectStore;
import org.intermine.util.TypeUtil;
import org.intermine.web.logic.bag.InterMineBag;
import org.intermine.web.logic.widget.config.GraphWidgetConfig;
import org.jfree.chart.ChartColor;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartRenderingInfo;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.entity.StandardEntityCollection;
import org.jfree.chart.imagemap.ImageMapUtilities;
import org.jfree.chart.labels.CategoryItemLabelGenerator;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.servlet.ServletUtilities;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.urls.CategoryURLGenerator;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.general.Dataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;
import org.jfree.ui.TextAnchor;
/**
* @author "Xavier Watkins"
*
*/
public class GraphWidget extends Widget
{
private static final Logger LOG = Logger.getLogger(GraphWidget.class);
private int notAnalysed = 0;
private DataSetLdr dataSetLdr;
private InterMineBag bag;
private ObjectStore os;
private String fileName = null;
private String imageMap = null;
private String selectedExtraAttribute;
private static final ChartColor BLUE = new ChartColor(47, 114, 255);
private static final ChartColor LIGHT_BLUE = new ChartColor(159, 192, 255);
private static final ChartColor DARK_BLUE = new ChartColor(39, 77, 216);
// ---- snip ----
/**
* {@inheritDoc}
*/
public void process() {
String dataSetLoader = config.getDataSetLoader();
Class<?> clazz = TypeUtil.instantiate(dataSetLoader);
// --- snip ---
if (dataSetLdr == null || dataSetLdr.getDataSet() == null) {
LOG.error("No data found for graph widget");
return;
}
JFreeChart chart = null;
Dataset graphDataSet = dataSetLdr.getDataSet();
String graphType = ((GraphWidgetConfig) config).getGraphType();
// --- snip ---
if (StringUtils.isNotEmpty(graphType) && graphType.equals("BarChart")) {
chart = ChartFactory.createBarChart(config.getTitle(), // chart title
((GraphWidgetConfig) config).getDomainLabel(),
((GraphWidgetConfig) config).getRangeLabel(),
(CategoryDataset) graphDataSet, // data
PlotOrientation.VERTICAL, true, true, // tooltips?
false // URLs?
);
if (selectedExtraAttribute != null
&& !selectedExtraAttribute.startsWith("any")) {
TextTitle subtitleText = new TextTitle(selectedExtraAttribute);
subtitleText.setFont(new Font("SansSerif", Font.ITALIC, 10));
chart.addSubtitle(subtitleText);
}
CategoryPlot categoryPlot = chart.getCategoryPlot();
CategoryItemRenderer categoryRenderer = new BarRenderer();
((BarRenderer) categoryRenderer).setItemMargin(0);
categoryRenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.OUTSIDE12, TextAnchor.BOTTOM_CENTER));
categoryRenderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.OUTSIDE6, TextAnchor.TOP_CENTER));
categoryPlot.setRenderer(categoryRenderer);
// rotate the category labels
categoryPlot.getDomainAxis().setCategoryLabelPositions(
CategoryLabelPositions.createUpRotationLabelPositions(Math.PI / 6.0));
setURLGen(categoryRenderer);
((BarRenderer) categoryRenderer).setNegativeItemLabelPositionFallback(
new ItemLabelPosition(ItemLabelAnchor.OUTSIDE3, TextAnchor.BASELINE_LEFT));
formatBarCharts(categoryPlot);
}
if (chart.getTitle() != null) {
chart.getTitle().setFont(new Font("SansSerif", Font.BOLD, 12));
}
chart.setPadding(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
chart.setAntiAlias(false); // render the chart faster, but won't look as good.
ChartRenderingInfo info = new ChartRenderingInfo(new StandardEntityCollection());
// generate the image and imagemap
try {
fileName = ServletUtilities.saveChartAsPNG(chart,
((GraphWidgetConfig) config).getWidth(),
((GraphWidgetConfig) config).getHeight(), info,
((GraphWidgetConfig) config).getSession());
} catch (IOException e) {
throw new RuntimeException("error rendering html", e);
}
imageMap = ImageMapUtilities.getImageMap("chart" + fileName, info);
}
private void formatBarCharts(CategoryPlot categoryPlot) {
if (categoryPlot != null) {
// display values for each column
CategoryItemLabelGenerator generator = new StandardCategoryItemLabelGenerator();
categoryPlot.getRenderer().setBaseItemLabelsVisible(true);
categoryPlot.getRenderer().setBaseItemLabelGenerator(generator);
categoryPlot.getRenderer().setBaseToolTipGenerator(new ToolTipGenerator());
NumberAxis rangeAxis = (NumberAxis) categoryPlot.getRangeAxis();
rangeAxis.setUpperMargin(0.15);
rangeAxis.setLowerMargin(0.15);
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
Font labelFont = new Font("SansSerif", Font.BOLD, 12);
categoryPlot.getDomainAxis().setLabelFont(labelFont);
rangeAxis.setLabelFont(labelFont);
categoryPlot.getDomainAxis().setMaximumCategoryLabelWidthRatio(10.0f);
categoryPlot.getRenderer().setSeriesPaint(0, BLUE);
categoryPlot.getRenderer().setSeriesPaint(1, LIGHT_BLUE);
categoryPlot.getRenderer().setSeriesPaint(2, DARK_BLUE);
categoryPlot.getRenderer().setSeriesOutlineStroke(1, new BasicStroke(0.0F));
categoryPlot.setBackgroundPaint(Color.white);
categoryPlot.setDomainGridlinePaint(Color.LIGHT_GRAY);
categoryPlot.setDomainGridlinesVisible(true);
categoryPlot.setRangeGridlinePaint(Color.LIGHT_GRAY);
}
}
// --- snip ---