Domanda

Ho alcuni dati memorizzati in un database come questo:

NomeTabella:Tabella dei difetti:

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

Come dovrei ottenere un grafico dell'istogramma a partire da questa tabella?

È stato utile?

Soluzione

La soluzione seguente presuppone che tu abbia MySQL, Python e GNUPlot.I dettagli specifici possono essere messi a punto se necessario.Pubblicandolo in modo che possa essere una base di riferimento per altri colleghi.

Passo 1:Decidi il tipo di grafico.

Se si tratta di un grafico di frequenza di qualche tipo, allora una semplice query SQL dovrebbe fare al caso nostro:

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

Se è necessario specificare le dimensioni dei contenitori, procedere al passaggio successivo.

Passo 2:Assicurati di essere in grado di connetterti a MySQL utilizzando Python.A tale scopo è possibile utilizzare l'importazione MySQLdb.

Successivamente, il codice Python per generare dati per un grafico a istogramma è il seguente (è stato scritto esattamente in 5 minuti, quindi è molto rozzo):

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")

Passaggio n. 3:Usa GNUPlot per generare l'istogramma.Puoi utilizzare il seguente script come punto di partenza (genera un file immagine eps):

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

Salva lo script sopra in un file arbitrario, ad esempio sample.script.Procedi al passaggio successivo.

Passaggio n. 4:Usa gnuplot con lo script di input sopra per generare un file eps

gnuplot sample.script

Niente di complicato, ma ho pensato che un paio di bit di questo codice potessero essere riutilizzati.Ancora una volta, come ho detto, non è perfetto ma puoi portare a termine il lavoro :)

Crediti:

Altri suggerimenti

questo articolo del blog può aiutare ! Si parla di statistica utilizzando gnuplot e tracciare il risultato in istogramma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top