plot - JFreechart Polar Chart shape annotation -
i trying color different region of polar chart different colors. e.g coloring region between angle 20 , 60 , between radii 2 , 4. how can this? thinking of using shape annotation , there drawing arc, seems there no shape annotation polar plots. ideas? thank you
import java.awt.color; import java.awt.dimension; import java.util.arraylist; import java.util.list; import javax.swing.jframe; import org.jfree.chart.chartpanel; import org.jfree.chart.jfreechart; import org.jfree.chart.axis.numberaxis; import org.jfree.chart.axis.numbertick; import org.jfree.chart.axis.valueaxis; import org.jfree.chart.plot.polarplot; import org.jfree.chart.renderer.defaultpolaritemrenderer; import org.jfree.chart.renderer.polaritemrenderer; import org.jfree.data.xy.xydataset; import org.jfree.data.xy.xyseries; import org.jfree.data.xy.xyseriescollection; import org.jfree.ui.textanchor; public class test2 extends jframe { private static final string title = "archimedes' spiral"; public test2(string title) { super(title); jfreechart chart = createchart(createdataset()); chartpanel panel = new chartpanel(chart); panel.setpreferredsize(new dimension(500, 500)); panel.setmousezoomable(false); this.add(panel); } private static xydataset createdataset() { xyseriescollection result = new xyseriescollection(); xyseries series = new xyseries(title); xyseries ser = new xyseries("test"); (int t = 0; t <= 1 * 360; t++) { series.add(90 - t, t); } (int t = 0; t <= 1 * 120; t++) { ser.add(90 - t, 40); ser.add(90 - t, 120); } result.addseries(series); result.addseries(ser); return result; } private static jfreechart createchart(xydataset dataset) { valueaxis radiusaxis = new numberaxis(); radiusaxis.setticklabelsvisible(false); polaritemrenderer renderer = new defaultpolaritemrenderer(); polarplot plot = new polarplot(dataset, radiusaxis, renderer) { @override protected list refreshangleticks() { list<numbertick> ticks = new arraylist<numbertick>(); int delta = (int) this.getangletickunit().getsize(); (int t = 0; t < 360; t += delta) { int tp = (360 + 90 - t) % 360; numbertick tick = new numbertick( double.valueof(t), string.valueof(tp), textanchor.center, textanchor.center, 0.0); ticks.add(tick); } return ticks; } }; plot.setbackgroundpaint(new color(0x00f0f0f0)); plot.setradiusgridlinepaint(color.gray); plot.addcornertextitem("r(θ) = θ; 0 < θ < 6π"); defaultpolaritemrenderer ren = new defaultpolaritemrenderer(); ren.setseriesfilled(0, true); ren.setseriesfilled(1, true); plot.setrenderer(ren); jfreechart chart = new jfreechart( title, jfreechart.default_title_font, plot, true); chart.setbackgroundpaint(color.white); return chart; } public static void main(string[] args) { test2 demo = new test2(title); demo.setdefaultcloseoperation(jframe.exit_on_close); demo.pack(); demo.setlocationrelativeto(null); demo.setvisible(true); } }
the defaultpolaritemrenderer
typically used in polarplot
has method setseriesfilled()
, controls whether series filled. renderer specifies alphacomposite.src_over
mode value of 50%, overlapping fills nice.
addendum: create chart seen below, start example , reduce data set's domain 6π 2π in createdataset()
:
for (int t = 0; t <= 1 * 360; t++) { ...
then make series filled in createchart()
:
... defaultpolaritemrenderer renderer = new defaultpolaritemrenderer(); renderer.setseriesfilled(0, true); ...
Comments
Post a Comment