and I wonder if chart component offers similar functionality. I have a simple chart with one value and I would like to make it more pleasant to an eye by having the line smoothly drawn. For example, in the picture below, I have a green line and i want it to be drawn like the red line.
You can add XYSplineRenderer even though it isn’t in the list of renderer under Dataset Customizer.
I would do something as below:
from org.jfree.chart.renderer.xy import XYSplineRenderer
chart = event.source.chart
plot = chart.getXYPlot()
renderer = XYSplineRenderer()
# The Precision makes curve smooth ! You can play with changing the numbers.
renderer.setPrecision(15)
plot.setRenderer(renderer)
I have this script on the mouseClicked Event Handler of the chart which changes the chart to curve when I click on it. Best Idea would be to have it on ConfigureChart Extended Function !!
If you’re adding a new series (dataset), code won’t change as long it’s the same plot because you’re rendering to the plot which includes all series.
Oddly, the second dataset wouldn’t correctly render for me. I had to use this:
from org.jfree.chart.renderer.xy import XYSplineRenderer
plot = chart.getPlot()
rendererCount = plot.getRendererCount()
renderer = XYSplineRenderer()
# The Precision makes curve smooth ! You can play with changing the numbers.
renderer.setPrecision(15)
for i in range(rendererCount):
plot.setRenderer(i, renderer)
Also this completely breaks if you use subplots, as the plot type goes to CombinedDomainXYPlot.
This seems to work for me:
from org.jfree.chart.renderer.xy import XYSplineRenderer
renderer = XYSplineRenderer()
# The Precision makes curve smooth ! You can play with changing the numbers.
renderer.setPrecision(15)
plot = chart.getPlot()
# Get plot type
plotType = plot.getPlotType()
if plotType == 'XY Plot':
rendererCount = plot.getRendererCount()
for i in range(rendererCount):
plot.setRenderer(i, renderer)
if plotType == 'Combined_Domain_XYPlot':
subplots = plot.getSubplots()
for subplot in subplots:
rendererCount = subplot.getRendererCount()
for i in range(rendererCount):
subplot.setRenderer(i, renderer)
Try this...
from org.jfree.chart.renderer.xy import XYSplineRenderer
from java.awt import Color, Font
chartColors = [Color.BLACK, Color.GREEN, Color.CYAN, Color.orange, Color.GRAY]
renderer = XYSplineRenderer()
`# The Precision makes curve smooth ! You can play with changing the numbers.`
renderer.setPrecision(15)
#This will hide the shapes !
renderer.setBaseShapesVisible(0)
chart = event.source.chart
plot = chart.getPlot()
`# Get plot type`
plotType = plot.getPlotType()
if plotType == 'XY Plot':
rendererCount = plot.getRendererCount()
for i in range(rendererCount):
plot.setRenderer(i, renderer)
if plotType == 'Combined_Domain_XYPlot':
subplots = plot.getSubplots()
for subplot in subplots:
rendererCount = subplot.getRendererCount()
for i in range(rendererCount):
subplot.setRenderer(i, renderer)
#set dynamic Colors -
for i in range(plot.getSeriesCount()):
plot.getRenderer().setSeriesPaint(i, chartColors[i %(len(chartColors))])