Мне было интересно, возможно ли построить (XYPlot
) набор данных в JFreeChart, где серии, содержащиеся в наборе данных, нанесены на отдельные диапазоны по оси Y. Дата группируется по категории / метке времени, например, если бы мой набор данных был таким:
Timestamp Val1 Val2
2019-04-26 0.6 603
2019-04-25 2.1 1040
2019-04-24 4.1 255
Невозможно нанести оба ряда значений на одну и ту же ось диапазона.
Я попытался извлечь каждую серию в отдельный набор данных, чтобы я мог позвонить plot.mapDataSetToRangeAxis()
; но когда я добавляю на график несколько наборов данных, столбцы, как правило, отображаются друг над другом. Возможно, я упускаю что-то простое?
Есть несколько постов, которые касаются отдельных элементов того, что я ищу, но думаю, что мне нужно что-то, что объединяет эти два:
Вот код python , который я сейчас использую - внутри модуля отчетности по индуктивной автоматизации / зажиганию; они позволяют вам настроить JFreeChart перед рендерингом.
def configureChart(chart):
from org.jfree.chart.axis import DateAxis
from org.jfree.data.xy import XYSeries, XYSeriesCollection
from org.jfree.chart.renderer.xy import ClusteredXYBarRenderer
from java.awt import Color
from java.text import NumberFormat
class mins_to_str(NumberFormat):
def format(self,*args,**kwargs):
r = ''
number = args[0]
hrs = number//60
mins = number%60
r = '%02i:%02i' %(hrs,mins)
if len(args)>1:
toAppendTo = args[1]
pos = args[2].getField()
r = toAppendTo.insert(pos,r)
return r
plt = chart.getPlot()
renderer = ClusteredXYBarRenderer
xax = DateAxis()
plt.setDomainAxis(xax)
for i in range(plt.getDatasetCount()):
d = plt.getDataset(i)
dsc = XYSeriesCollection()
series = XYSeries(d.getSeriesKey(0))
print('SERIES [%s]' %series)
for r in range(d.getItemCount(0)):
xv = d.getXValue(0,r)
yv = d.getYValue(0,r)
print(' X: %s (%s)' %(xv,type(xv)))
print(' Y: %s (%s)' %(yv,type(yv)))
series.add(xv,yv)
dsc.addSeries(series)
plt.setDataset(i,dsc) # assuming all of my series need to be in the same dsc for this to work...
plt.setRenderer(i,renderer)
if i > 0:
plt.mapDatasetToRangeAxis(i,1)
else:
plt.mapDatasetToRangeAxis(i,0)
plt.getRangeAxis(0).setNumberFormatOverride(mins_to_str())
В настоящее время я получаю это:
Любые идеи / помощь будет принята с благодарностью.