Suche // Search:

Posts mit dem Label Bar Chart werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Bar Chart werden angezeigt. Alle Posts anzeigen

20.12.2010

FormCalc Diagramme Teil 5 - Automatisch vergrößerndes, gestapeltes Säulendiagramm
//
FormCalc Charts Pt.5 - Auto-resizing, stacked Bar Charts

Dies ist eine Weiterentwicklung von dem gestapelten Säulendiagramm, dass ich vor einiger Zeit geposted habe.
Bei dem alten Beispiel störte mich die Beschränkung auf einen bestimmten Wertebereich.
War dieser nicht ausreichend groß dimensioniert, wuchs das Diagramm mitunter oben aus dem Darstellungsbereich heraus.

Mit einer kleinen Ergänzung im Berechnungsalgoritmus ist dies nun aber kein Problem mehr.

Mittels eines Faktors kann der Wertbereich beliebig groß definiert werden.
Dafür prüft eine For-Schreife, ob das größte aller Gesamtergebnisse innerhalb eines bestimmten Bereichs liegt.
Trifft dies zu, wird dann ein Faktor anhand dieses Wertes berechnet, der später in die Berechnung der Balken einbezogen wird.

Des Weiteren wird eine Formularvariable "RenderChart" verwendet, die verhindert, dass der Trigger das Diagramm auch neu berechnet, wenn gar keine Änderung an den Eingabedaten vorliegt.
Mit einem If-Ausdruck wird das ganze Berechnungsskript umfasst und nur dann ausgeführt, wenn die Formvariable den Wert "true" hat.


This is an upgrade of the stacked bar chart I've posted a while ago.
In this old example I get bothered by the limitation of the range of values.
If it was to small the chart began to grow out of the displaying area.

But, with a small addition to the algorithm I was able to solve this problem.

With the use of a factor the range of values can be as large as you like.
Therefor a for-loop is used, which checks if the largest of all total results is within a specific range.
If so, the factor will be calculated by this value and later reused to calculate the bars.

In addition a form variable "RenderChart" is used to suppress a recalculation of the charts if there has been no changes to the input values.
With an if-expression which surrounds the whole calculation script, the script is only executed if the form variable has the value "true".

FormCalc-Skript
//
FormCalc script:

var Check = RenderChart.value
if (Check eq "true") then
var Factor
var MaxInput = Max(Input.Table.ChartValues[*].Sum)
var Fmin
var Fmax
for f = 0 upto 9950 step 50 do
Fmin = f
Fmax = Fmin + 50
if (Within(MaxInput, Fmin, Fmax) eq 1) then
Factor = 1 / (Fmax / 100)
endif
endfor

var nRows = Input.Table.ChartValues.instanceManager.count
_Chart.setInstances(nRows)
var nColumns = Input.Table.ChartValues[nRows -1].Col.instanceManager.count
Chart[*].Stack._Bar[*].setInstances(nColumns)
Chart[*].Labels._Label[*].setInstances(nColumns)

for i=0 upto nRows -1 step 1 do
for j=0 upto nColumns -1 step 1 do
var BarValue = Input.Table.ChartValues[i].Col[j].Amount
for y = 10 downto 0 step 1 do
Output.yAxis.Mark[y].Mark.value.text.value = Round((10 - y) * 10 / Factor)
endfor

var nColor = Choose( j + 1, ;Instance (+1) = position in this list
"238,0,0", ;Red
;"255,48,48", ;FireBrick
"255,99,71", ;Tomato
"255,127,80", ;Coral
"255,140,0", ;DarkOrange
"255,165,0", ;Orange
"255,215,0", ;Gold
"255,255,0", ;Yellow
;"238,238,0", ;Yellow2
"154,205,50") ;YellowGreen
Chart[i].Stack.Bar[j].BarGraph.value.rectangle.fill.color.value = nColor
Chart[i].Stack.Bar[j].BarGraph.value.rectangle.edge.color.value = nColor

if (BarValue > 0) then
Chart[i].Stack.Bar[j].presence = "visible"
else
Chart[i].Stack.Bar[j].presence = "invisible"
endif

var ChartMod = UnitValue(BarValue, "in") / 25.4
Chart[i].Stack.Bar[j].BarGraph.h = UnitValue(ChartMod, "in") * Factor
Chart[i].Labels.Label[j].BarValue.h = UnitValue(ChartMod, "in") * Factor
Chart[i].Labels.BarTotal = Input.Table.ChartValues[i].Sum
Chart[i].Labels.BarLabel = Input.Table.ChartValues[i].Label

if(BarValue * Factor >= 3) then
Chart[i].Labels.Label[j].BarValue.value.text.value = Input.Table.ChartValues[i].Col[j].Amount
else
Chart[i].Labels.Label[j].BarValue.value.text.value = ""
endif

var ContainerHeight = UnitValue(Chart.h, "in")
var MoveHeight = UnitValue(Input.Table.ChartValues[i].Sum, "in") / 25.4 * Factor
Chart[i].Stack.y = ContainerHeight - MoveHeight
Chart[i].Labels.y = ContainerHeight - MoveHeight - UnitValue("5mm", "in")
endfor
endfor
endif


Beispiele gestapelter Balkendiagramme
//
Stacked Bar Charts Examples

Wertebereich 0 - 150 // Range of values 0 - 150


Wertebereich 0 - 550 // Range of values 0 - 550



Wertebereich 0 - 1300 // Range of values 0 - 1300




Bespiel-Formular
//
Sample form:
https://files.acrobat.com/a/preview/d9eaad0a-fea0-4303-8fd4-74a24fadb6fc


14.03.2010

FormCalc Diagramme Teil 1 - Säulendiagramm
//
FormCalc Charts Pt.1 - Bar Charts

Ein riesen Manko am LiveCycle Designer ist, dass er keine Diagramme aus den Formulardaten erstellen kann, so wie das Excel kann.
Mit etwas Einsatz vom FormCalc, kann man dies aber (schnell) beseitigen.
Dieses Beispiel ist eine Weiterentwicklung des Scripts, dass ich vor knapp einem Jahr im Acrobatusers.com-Forum geposted habe.

Es besteht aus einer Tabelle zum Eingeben der Daten (Beschreibung und Wert sowie Farbe) und einem Teilformular mit einem verstecktem Feld, dass die Diagramme per FormCalc quasi in Echtzeit berechnet.

One of LiveCycle Designers flaws is, that it can't generate chart from the form data such as Excel does.
But with some FormCalc experiences this can be solved.
This example is a new version of a script I posted about a year ago in the Acrobatusers.com community.

It contains a table for the inputs (label, value and color) and a subform with a hidden field that calculates the chart quasi in realtime.

FormCalc-Script:

var nCharts = Input.Table.ChartValues.instanceManager.count

_Chart.setInstances(nCharts)

var CurrentInstance = $.parent.index
var ChartValue = Input.Table.ChartValues[CurrentInstance].Amount
var ChartLabel = Input.Table.ChartValues[CurrentInstance].Label.value.text.value
var ChartColor = Input.Table.ChartValues[CurrentInstance].Color.value.text.value
var ChartMod = UnitValue(ChartValue / 25.4)
var Maximum = UnitValue(105 / 25.4)

if(ChartMod > Maximum) then
ChartMod = Maximum
zLine.presence = "visible"
elseif(ChartMod <= Maximum) then
zLine.presence = "invisible"
endif


var ChartMove = Round(UnitValue(ChartMod * 25.4))
var ContainerHeight = Round(UnitValue(Output.Chart.h))
var ChartStart = ContainerHeight
var ChartEnd = ChartStart - ChartMove

if (ChartValue >= 0) then
Bar.presence = "visible"
Bar.h = ChartMod
Bar.y = UnitValue(ChartEnd / 25.4 )
BarValue.value.text.value = ChartValue
BarValue.y = UnitValue(ChartEnd / 25.4 )
BarLabel.presence = "visible"
BarLabel.value.text.value = ChartLabel
BarLabel.y = UnitValue(ChartEnd / 25.4 )

if(ChartColor == "O")then
Bar.value.rectangle.fill.color.value = "255,153,0"
elseif(ChartColor == "R") then
Bar.value.rectangle.fill.color.value = "255,0,0"
elseif(ChartColor == "B") then
Bar.value.rectangle.fill.color.value = "0,0,255"
elseif(ChartColor == "G") then
Bar.value.rectangle.fill.color.value = "0,255,0"
endif

else
Bar.presence = "invisible"
Bar.presence = "invisible"
BarLabel.presence = "invisible"
endif

Säulendiagramm // Bar Chart:


Beispiel // Example: