Liniendiagramm erstellen

  • Hi Leute,
    ich suche eine Möglichkeit ein Liniendiagramm in AutoIT zu erstellen, bei dem der y Wert in einer Array gespeichert ist und der x Wert immer regelmäßig aufsteigend ist (0,1,2,3 etc...)
    Ich habe ein paar Scripte gefunden, aber entweder waren diese für ein Balkendiagramm oder haben überhaupt gar nicht funktioniert.
    Ich wollte euch deshalb fragen, ob ihr eine Möglichkeit kennt das zu realisieren
    Fliwatt

  • Hängt natürlich davon ab, was Du damit machen willst. Eine Möglichkeit ist natrülich noch ExcelChart.

  • Willst du regelmäßige Diagramme erzeugen (Bestimmt durch lineare oder quadratische Funktionen) oder durch eigene Werte (Messergebnisse o.Ä.) bestimmte?
    Für funktionale Diagramme (Graphen, Parabeln etc...) habe ich ein fertiges Skript (Gerade nicht hier, editiere ich nachher rein).

    Für individuelle Werte müsste das leicht anpassbar sein.
    Am einfachsten geht das mit GDI oder GDI+, jeweils mit einfachem Line-Drawing.

    chess

    Edit:
    Hier noch der Quellcode.
    Das Handling ist nicht optimal, aber das liegt daran, dass ich das Skript 20 Mal umgeschrieben habe, um einen Fehler zu beheben, der bis heute existiert.
    Ich weiß aber auch nicht, wie ich das fixen soll... :wacko:
    Wenn du mal auf die Zeichenzeit achtest, nach so 10 - 15 Zeichendurchgängen, und dann mal mit der ersten Zeitspanne vergleichst...

    Spoiler anzeigen
    [autoit]


    #include <GUIConstants.au3>
    #include <ComboConstants.au3>
    #include <GUIListView.au3>
    #include <EditConstants.au3>
    #include <GUIEdit.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("CreateAGraph - Version 0.1", 700, 500)
    Dim $hFunctionInput[5], $hFunctionEnable[5], $aCoordinates[500][2]
    Dim $asGraphColors[5] = [0x0000FF, 0x00FF00, 0xFF0000, 0xFF00FF, 0x00FFFF]

    [/autoit] [autoit][/autoit] [autoit]

    For $iCtrl = 0 To 4
    $hFunctionInput[$iCtrl] = GUICtrlCreateInput("", 20, ($iCtrl * 20) + 100, 180, 20)
    $hFunctionEnable[$iCtrl] = GUICtrlCreateCheckbox("", 0, ($iCtrl * 20) + 100, 20, 20)
    GUICtrlSetBkColor(-1, $asGraphColors[$iCtrl])
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $hLogoLabel = GUICtrlCreateLabel("CreateAGraph", 10, 10, 180, 40)
    GUICtrlSetFont(-1, 20)
    $hNameLabel = GUICtrlCreateLabel("chesstiger", 10, 50, 180, 20)
    GUICtrlSetFont(-1, 10)
    $hFireButton = GUICtrlCreateButton("Zeichnen", 0, 200, 200, 30)
    $hListView = GUICtrlCreateListView("", 0, 260, 200, 100)
    $hComboBox = GUICtrlCreateCombo("", 0, 240, 200, 40, $CBS_DROPDOWNLIST)
    GUICtrlSetData(-1, "Funktion 1|Funktion 2|Funktion 3|Funktion 4|Funktion 5", "Funktion 1")
    $hGraphic = GUICtrlCreateGraphic(200, 0, 500, 500)
    $hLogEdit = GUICtrlCreateEdit("", 0, 370, 200, 130)
    _ClearGraphic($hGraphic)
    $hGlider = _DrawGlider()
    _DrawScale($hGraphic)

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()
    While 1
    $iMsg = GUIGetMsg()
    Switch $iMsg
    Case -3
    Exit
    Case $hFireButton
    _ReleaseGlider($hGlider)
    _ClearGraphic($hGraphic)
    $hTimerDrawAll = TimerInit()
    _ConsoleWrite("Drawing started..." & @CRLF & @CRLF)
    For $i = 0 To 4
    $hTimerDrawSingle = TimerInit()
    If GUICtrlRead($hFunctionEnable[$i]) = 1 Then
    _CreateGraph(GUICtrlRead($hFunctionInput[$i]), $asGraphColors[$i])
    _ConsoleWrite("Graph " & $i & " enabled." & @CRLF & @TAB & "Time: " & Round(TimerDiff($hTimerDrawSingle), 4) & " ms" & @CRLF)
    Else
    _ConsoleWrite("Graph " & $i & " disabled." & @CRLF & @TAB & "Time: " & Round(TimerDiff($hTimerDrawSingle), 4) & " ms" & @CRLF)
    EndIf
    Next
    _DrawScale($hGraphic)
    $hGlider = _DrawGlider()
    _ConsoleWrite("Drawing ended!" & @CRLF & "Time (All): " & Round(TimerDiff($hTimerDrawAll), 4) & " ms" & @CRLF)
    Case $hComboBox
    _LoadListView()
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func _CreateGraph($sFunction, $iColor)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_MOVE, 0, 250 - Execute(StringReplace($sFunction, "X", -250 / 10) )*10, 0)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_COLOR, $iColor)
    For $iX = -250 To 250 Step 1
    $iY = Execute(StringReplace($sFunction, "X", $iX /10))
    $iRet = GUICtrlSetGraphic($hGraphic, $GUI_GR_LINE, $iX + 250, 250 - $iY * 10)
    Next
    GUICtrlSetGraphic($hGraphic, $GUI_GR_REFRESH)
    EndFunc ;==>_CreateGraph

    [/autoit] [autoit][/autoit] [autoit]

    Func _ClearGraphic(ByRef $hGraphic)
    GUICtrlDelete($hGraphic)
    $hGraphic = GUICtrlCreateGraphic(200, 0, 500, 500)
    GUICtrlSetColor(-1, 0x0000FF)
    GUICtrlSetBkColor(-1, 0xFFFFFF)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_PENSIZE, 3)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_MOVE, 100, 100)
    EndFunc ;==>_ClearGraphic

    [/autoit] [autoit][/autoit] [autoit]

    Func _CreateArrayFromFunction($sFunction)
    Dim $aCoordinates[501][2]
    For $iX = -250 To 250 Step 1
    $iY = Execute(StringReplace($sFunction, "X", $iX / 10))
    $aCoordinates[($iX+250)][0] = $iX / 10
    $aCoordinates[($iX+250)][1] = $iY
    Next
    Return $aCoordinates
    EndFunc ;==>_CreateArrayFromFunction

    [/autoit] [autoit][/autoit] [autoit]

    Func _LoadListView()
    GUICtrlDelete($hListView)
    $hListView = GUICtrlCreateListView("", 0, 260, 200, 100)
    _GUICtrlListView_AddColumn($hListView, "X", 50)
    _GUICtrlListView_AddColumn($hListView, "Y", 129)
    $iFunction = StringTrimLeft(GUICtrlRead($hComboBox), 9)
    $aCoordinates = _CreateArrayFromFunction(GUICtrlRead($hFunctionInput[$iFunction - 1]))
    _GUICtrlListView_AddArray($hListView, $aCoordinates)
    EndFunc ;==>_LoadListView

    [/autoit] [autoit][/autoit] [autoit]

    Func _ConsoleWrite($sText)
    GUICtrlSetData($hLogEdit, GUICtrlRead($hLogEdit) & $sText)
    _GUICtrlEdit_LineScroll($hLogEdit, 0, _GUICtrlEdit_GetLineCount($hLogEdit))
    EndFunc ;==>_ConsoleWrite

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawScale($hGraphic)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_PENSIZE, 2)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_MOVE, 250, 0)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_COLOR, 0x000000)
    ;Hauptgitter
    GUICtrlSetGraphic($hGraphic, $GUI_GR_LINE, 250, 500)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_MOVE, 0, 250)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_LINE, 500, 250)
    ;Skalierungsstriche
    GUICtrlSetGraphic($hGraphic, $GUI_GR_PENSIZE, 1)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_COLOR, 0x000000)
    For $i = 0 To 50
    GUICtrlSetGraphic($hGraphic, $GUI_GR_MOVE, 245, $i * 10)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_LINE, 255, $i * 10)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_MOVE, $i * 10, 245)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_LINE, $i * 10, 255)
    Next
    ;Refresh
    GUICtrlSetGraphic($hGraphic, $GUI_GR_REFRESH)
    EndFunc ;==>_DrawScale

    [/autoit] [autoit][/autoit] [autoit]

    Func _DrawGlider()
    $hGraphic = GUICtrlCreateGraphic(200, 0, 500, 500)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_PENSIZE, 1)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_MOVE, 0, 0)
    GUICtrlSetGraphic($hGraphic, $GUI_GR_COLOR, 0x000000)
    ;Glider
    For $iY = 0 To 500 Step 10
    For $iX = 0 To 500 Step 10
    GUICtrlSetGraphic($hGraphic, $GUI_GR_PIXEL, $iX, $iY)
    Next
    Next
    GUICtrlSetGraphic($hGraphic, $GUI_GR_REFRESH)
    Return $hGraphic
    EndFunc ;==>_DrawGlider

    [/autoit] [autoit][/autoit] [autoit]

    Func _ReleaseGlider($hGraphic)
    GUICtrlDelete($hGraphic)
    EndFunc

    [/autoit]
  • Ich habe mir mal die Variante aus dem Thread von progandy herausgesucht, jedoch verstehe ich noch nicht, wie ich dort meine Werte einfüge,
    immer wenn ich etwas in der Dim verändere, kommen skurrile Werte heraus.
    Wie muss ich die Variable anpassen und was bedeuten die beiden Werte?
    Benutzung für das Programm:
    Ich habe verschiedene Nutzungszeiten eines Computers pro Session und will diese grafisch darstellen.
    Fliwatt

  • Graph UDF
    Graph UDF GDI+

    Nimmt sich nichts. Schon sehr oft benutzt, mit guten Ergebnissen. Beispiele sind dabei wenn ich nicht irre. (Ich irre mich. Sie ist aber sehr einfach zu verwenden). Ich empfehle dir die nicht-GDI+ Version. Am Ende ist das Programm kleiner und Graphics sind auch für diesen Zweck gemacht ^^:

    [Blockierte Grafik: http://1.2.3.9/bmi/www.autoitscript.com/forum/uploads/monthly_10_2009/post-29091-12554827927848_thumb.jpg][Blockierte Grafik: http://1.2.3.11/bmi/www.autoitscript.com/forum/uploads/monthly_10_2009/post-29091-12554841977305_thumb.jpg]

    2 Mal editiert, zuletzt von minx (22. Januar 2013 um 19:25)

  • Danke minx,
    ich benutze jetzt die NON-GDI Variante von dem Script, jedoch habe ich es noch nicht so recht verstanden:
    Wie füge ich jetzt meinen Graphen ein und wie bekomme ich es hin, dass an den Achsen Markierungen sind, muss ich das von Hand mit Labels machen?
    Code bis jetzt:

    [autoit]


    #include <GUIConstants.au3>
    #include "Graph UDF.au3"
    #Include <File.au3>
    FileWrite("a.txt",Random(1,30,1) & @CRLF & Random(1,30,1) & @CRLF & Random(1,30,1)) ; Nur fürs Testen des Scripts
    Local $array[_FileCountLines("a.txt")]
    _FileReadToArray("a.txt",$array)
    $Gui = GUICreate("Graf der Parabel",600,600)
    GUISetState(@SW_SHOW)
    $Graph = _Graph_Create(0,0,590,590)
    While 1
    If GUIGetMsg($Gui) = $GUI_EVENT_CLOSE Then Exit
    sleep(100)
    WEnd

    [/autoit]


    Fliwatt

  • Hier, ich habe dir mal ein kleines Tut gebastelt:

    Graph Tutorial
    [autoit]

    #include <Graph UDF.au3>

    [/autoit] [autoit][/autoit] [autoit]

    $hGUI = GUICreate("Sinuskurve", 800, 600); GUI Erstellen
    $Graph = _Graph_Create(50,50,700,500); Damit erstellen wir eine Zeichenfläche

    [/autoit] [autoit][/autoit] [autoit]

    ;_Graph_SetRange_X(ByRef $aGraphArray,$iLow,$iHigh,$iXTicks = 1,$bLabels = 1,$iRound = 0)

    [/autoit] [autoit][/autoit] [autoit]

    ; Jetzt setzen wir den Maßstab der x-Achse. Sagen wir mal von -5 bis +5

    [/autoit] [autoit][/autoit] [autoit]

    ; Mit dem 4. Paramter wird eingestellt, wie viele Beschriftungen es geben soll. 10 reichen hier aus, also
    ; in Einer-Schritten.

    [/autoit] [autoit][/autoit] [autoit]

    ; Der 5. Paramter wird von uns auf True, also 1 gesetzt, damit die UDF automatisch die Striche beschriftet

    [/autoit] [autoit][/autoit] [autoit]

    ; Der letzte Paramter gibt die Nachkommastellen der Beschriftung an. Wir brauchen keine, also setzen wir sie auf 0.

    [/autoit] [autoit][/autoit] [autoit]

    _Graph_SetRange_X($Graph, -5, 5, 10, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    ; Das gleiche für die y-Achse. Nur hier wollen wir im Bereich von -2 bis 2 darstellen

    [/autoit] [autoit][/autoit] [autoit]

    _Graph_SetRange_Y($Graph, -2, 2, 4, 1, 0)

    [/autoit] [autoit][/autoit] [autoit]

    ; Jetzt fügen wir noch Linien hinzu, die als Orientierung fungieren:
    _Graph_SetGrid_X($Graph)
    _Graph_SetGrid_Y($Graph)

    [/autoit] [autoit][/autoit] [autoit]

    ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    [/autoit] [autoit][/autoit] [autoit]

    ; Jetzt zeichnen wir mal die Kurve.

    [/autoit] [autoit][/autoit] [autoit]

    ; Wir setzen unseren Stift bei x = -5 und y = 0 an:
    _Graph_Plot_Start($Graph, -5, 0)

    [/autoit] [autoit][/autoit] [autoit]

    ; Jetzt zeichnen wir in Schritten:
    For $x = -5 To 5 Step 0.05; Der Step-Wert ist die Auflösung
    _Graph_Plot_Line($Graph, $x, Sin($x))
    Next

    [/autoit] [autoit][/autoit] [autoit]

    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    While GUIGetMsg()<>-3
    WEnd

    [/autoit]