Plotten Histogramm:Wie kann ich es tun, von Grund auf, mit in einer Datenbank gespeicherten Daten?

StackOverflow https://stackoverflow.com/questions/1767565

Frage

Ich habe einige Daten in einer Datenbank gespeichert wie dies:

TableName:Fehler Tabelle:

+------------+--------------+
| fault_type | total        |
+------------+--------------+
|    1       |            1 | 
|    2       |            3 | 
|    3       |            8 | 
|    4       |            2 | 
.............................

Wie soll ich Holen Sie sich eine Histogramm-plot ab diesem Tisch?

War es hilfreich?

Lösung

Die folgende Lösung geht davon aus, dass Sie MySQL, Python und GNUPlot.Die Einzelheiten können fein abgestimmt werden, wenn nötig.Buchung es so, dass es könnte eine Basis für andere Kollegen.

Schritt #1:Bestimmen Sie die Art der Grafik.

Wenn es ist eine Frequenz Grundstück von einige Art, dann eine einfache SQL-Abfrage sollte den trick tun:

select total, count(total) from faults GROUP BY total;

Wenn Sie angeben müssen, bin Größen, dann gehen Sie zum nächsten Schritt.

Schritt #2:Stellen Sie sicher, Sie sind in der Lage, eine Verbindung zu MySQL mit Python.Sie können die MySQLdb import, dies zu tun.

Nach, dass, die python-code zu generieren, Daten für eine Histogramm-plot ist die folgende (dies wurde geschrieben, gerade in 5 Minuten, so es ist sehr grob):

import MySQLdb

def DumpHistogramData(databaseHost, databaseName, databaseUsername, databasePassword, dataTableName, binsTableName, binSize, histogramDataFilename):
    #Open a file for writing into
    output = open("./" + histogramDataFilename, "w")

    #Connect to the database
    db = MySQLdb.connect(databaseHost, databaseUsername, databasePassword, databaseName)
    cursor = db.cursor()

    #Form the query
    sql = """select b.*, count(*) as total 
            FROM """ + binsTableName + """ b 
            LEFT OUTER JOIN """ + dataTableName + """ a 
            ON a.total between b.min AND b.max 
            group by b.min;"""
    cursor.execute(sql)

    #Get the result and print it into a file for further processing
    count = 0;
    while True:
        results = cursor.fetchmany(10000)
        if not results:
            break
        for result in results:
            #print >> output, str(result[0]) + "-" + str(result[1]) + "\t" + str(result[2])
    db.close()

def PrepareHistogramBins(databaseHost, databaseName, databaseUsername, databasePassword, binsTableName, maxValue, totalBins):

    #Connect to the database    
    db = MySQLdb.connect(databaseHost, databaseUsername, databasePassword, databaseName)
    cursor = db.cursor()

    #Check if the table was already created
    sql = """DROP TABLE IF EXISTS """ + binsTableName
    cursor.execute(sql)

    #Create the table
    sql = """CREATE TABLE """ + binsTableName + """(min int(11), max int(11));"""
    cursor.execute(sql)

    #Calculate the bin size
    binSize = maxValue/totalBins

    #Generate the bin sizes
    for i in range(0, maxValue, binSize):
        if i is 0:
            min = i
            max = i+binSize
        else:
            min = i+1
            max = i+binSize
        sql = """INSERT INTO """ + binsTableName + """(min, max) VALUES(""" + str(min) + """, """ + str(max) + """);"""
        cursor.execute(sql)
    db.close()
    return binSize

binSize = PrepareHistogramBins("localhost", "testing", "root", "", "bins", 5000, 100)
DumpHistogramData("localhost", "testing", "root", "", "faults", "bins", binSize, "histogram")

Schritt #3:Verwenden GNUPlot erzeugen das Histogramm.Sie können das folgende Skript verwenden, wie ein Ausgangspunkt (erzeugt ein eps-Bild-Datei):

set terminal postscript eps color lw 2 "Helvetica" 20
set output "output.eps"
set xlabel "XLABEL"
set ylabel "YLABEL"
set title "TITLE"
set style data histogram
set style histogram cluster gap 1
set style fill solid border -1
set boxwidth 0.9
set key autotitle columnheader
set xtics rotate by -45
plot "input" using 1:2 with linespoints ls 1

Speichern Sie das obige Skript in einer beliebigen Datei sagen, Probe.Skript.Gehen Sie zum nächsten Schritt.

Schritt #4:Verwenden gnuplot mit den oben genannten input-Skript zur Generierung einer eps-Datei

gnuplot sample.script

Nichts kompliziertes, aber ich dachte, ein paar Stückchen von diesem code kann wiederverwendet werden.Wieder, wie ich schon sagte, es ist nicht perfekt, aber Sie können den job zu erledigen :)

Credits:

Andere Tipps

Dieser Blog-Artikel können Sie helfen ! Er spricht über Statistik mit gnuplot und zeichnet das Ergebnis in Histogramm.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top