Issue
I have the following sample code for a JFreeChart, how to change the vertical bars to a solid color [ right now it has some white color in each bar ] ?
import java.awt.event.*;
import java.text.DecimalFormat;
import javax.swing.*;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.date.*;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.data.time.Day;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.IntervalXYDataset;
import org.jfree.data.xy.XYDataset;
public class Price_Volume_Chart_Demo extends JPanel // A demonstration application showing how to create a price-volume chart.
{
static boolean EXIT_ON_CLOSE_B=true;
public Price_Volume_Chart_Demo(String title)
{
JFreeChart chart=createChart();
ChartPanel panel=new ChartPanel(chart,true,true,true,false,true);
panel.setPreferredSize(new java.awt.Dimension(1000,500));
add(panel);
}
private JFreeChart createChart()
{
XYDataset priceData=createPriceDataset();
String title="Eurodollar Futures Contract (MAR03)";
JFreeChart chart=ChartFactory.createTimeSeriesChart(title,
"Date",
getYLabel("Price ( $ )"),
priceData,
true,
true,
true
);
XYPlot plot=chart.getXYPlot();
NumberAxis rangeAxis1=(NumberAxis)plot.getRangeAxis();
rangeAxis1.setLowerMargin(0.40); // to leave room for volume bars
DecimalFormat format=new DecimalFormat("00.00");
rangeAxis1.setNumberFormatOverride(format);
XYItemRenderer renderer1=plot.getRenderer();
/*
renderer1.setToolTipGenerator(
new StandardXYToolTipGenerator(
StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0.00")
)
);
*/
NumberAxis rangeAxis2=new NumberAxis("Volume");
rangeAxis2.setUpperMargin(1.00); // to leave room for price line
plot.setRangeAxis(1,rangeAxis2);
plot.setDataset(1,createVolumeDataset());
plot.setRangeAxis(1,rangeAxis2);
plot.mapDatasetToRangeAxis(1,1);
XYBarRenderer renderer2=new XYBarRenderer(0.20);
renderer2.setShadowVisible(false);
/*
renderer2.setToolTipGenerator(
new StandardXYToolTipGenerator(
StandardXYToolTipGenerator.DEFAULT_TOOL_TIP_FORMAT,
new SimpleDateFormat("d-MMM-yyyy"), new DecimalFormat("0,000.00")
)
);
*/
plot.setRenderer(1,renderer2);
return chart;
}
private static XYDataset createPriceDataset()
{
// create dataset 1...
TimeSeries series1=new TimeSeries("Price");
series1.add(new Day(2,MonthConstants.JANUARY,2002),95.565);
series1.add(new Day(3,MonthConstants.JANUARY,2002),95.640);
series1.add(new Day(4,MonthConstants.JANUARY,2002),95.710);
series1.add(new Day(7,MonthConstants.JANUARY,2002),95.930);
series1.add(new Day(8,MonthConstants.JANUARY,2002),95.930);
series1.add(new Day(9,MonthConstants.JANUARY,2002),95.960);
series1.add(new Day(10,MonthConstants.JANUARY,2002),96.055);
series1.add(new Day(11,MonthConstants.JANUARY,2002),96.335);
series1.add(new Day(14,MonthConstants.JANUARY,2002),96.290);
series1.add(new Day(15,MonthConstants.JANUARY,2002),96.275);
series1.add(new Day(16,MonthConstants.JANUARY,2002),96.240);
series1.add(new Day(17,MonthConstants.JANUARY,2002),96.080);
series1.add(new Day(18,MonthConstants.JANUARY,2002),96.145);
return new TimeSeriesCollection(series1);
}
private static IntervalXYDataset createVolumeDataset()
{
// create dataset 2...
TimeSeries series1=new TimeSeries("Volume");
series1.add(new Day(2,MonthConstants.JANUARY,2002),41020);
series1.add(new Day(3,MonthConstants.JANUARY,2002),45586);
series1.add(new Day(4,MonthConstants.JANUARY,2002),81672);
series1.add(new Day(7,MonthConstants.JANUARY,2002),81975);
series1.add(new Day(8,MonthConstants.JANUARY,2002),79692);
series1.add(new Day(9,MonthConstants.JANUARY,2002),53187);
series1.add(new Day(10,MonthConstants.JANUARY,2002),87929);
series1.add(new Day(11,MonthConstants.JANUARY,2002),107047);
series1.add(new Day(14,MonthConstants.JANUARY,2002),86276);
series1.add(new Day(15,MonthConstants.JANUARY,2002),79005);
series1.add(new Day(16,MonthConstants.JANUARY,2002),80632);
series1.add(new Day(17,MonthConstants.JANUARY,2002),88797);
series1.add(new Day(18,MonthConstants.JANUARY,2002),57179);
return new TimeSeriesCollection(series1);
}
String getYLabel(String Text)
{
String Result="";
for (int i=0;i<Text.length();i++) Result+=Text.charAt(i)+(i<Text.length()-1?"\u2009":"");
// Out(Result);
return Result;
}
private static void out(String message) { System.out.print(message); }
private static void Out(String message) { System.out.println(message); }
// Create the GUI and show it. For thread safety, this method should be invoked from the event-dispatching thread.
static void Create_And_Show_GUI()
{
final Price_Volume_Chart_Demo demo=new Price_Volume_Chart_Demo("Price Volume Chart Demo");
JFrame frame=new JFrame("Time_Series_Chart Frame");
frame.add(demo);
frame.addWindowListener( new WindowAdapter()
{
public void windowActivated(WindowEvent e) { }
public void windowClosed(WindowEvent e) { }
public void windowClosing(WindowEvent e) { if (EXIT_ON_CLOSE_B) System.exit(0); }
public void windowDeactivated(WindowEvent e) { }
public void windowDeiconified(WindowEvent e) { demo.repaint(); }
public void windowGainedFocus(WindowEvent e) { demo.repaint(); }
public void windowIconified(WindowEvent e) { }
public void windowLostFocus(WindowEvent e) { }
public void windowOpening(WindowEvent e) { demo.repaint(); }
public void windowOpened(WindowEvent e) { }
public void windowResized(WindowEvent e) { demo.repaint(); }
public void windowStateChanged(WindowEvent e) { demo.repaint(); }
});
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args)
{
// Schedule a job for the event-dispatching thread : creating and showing this application's GUI.
SwingUtilities.invokeLater(new Runnable() { public void run() { Create_And_Show_GUI(); } });
}
}
Solution
As shown here, use a StandardXYBarPainter
to get a flat effect instead of the default gradient.
XYBarRenderer renderer2=new XYBarRenderer(0.20);
renderer2.setBarPainter(new StandardXYBarPainter());
renderer2.setShadowVisible(false);
I tried, but didn't work:
renderer2.setDefaultBarPainter(new StandardXYBarPainter())
.
Note that XYBarRenderer.setDefaultBarPainter()
is a static
method. It should be called before instantiating the renderer.
XYBarRenderer.setDefaultBarPainter(new StandardXYBarPainter());
XYBarRenderer renderer2=new XYBarRenderer(0.20);
Either formulation produces the desired result:
As an aside, plot.setRangeAxis(1,rangeAxis2)
needs to be called only once.
Answered By - trashgod
0 comments:
Post a Comment
Note: Only a member of this blog may post a comment.