Trazado De Histograma:¿Cómo puedo hacer desde cero con los datos almacenados en una base de datos?

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

Pregunta

Tengo algunos datos almacenados en una base de datos como este:

TableName:fallos Tabla:

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

Cómo se supone que voy a obtener un histograma de la parcela a partir de esta tabla?

¿Fue útil?

Solución

La solución a continuación se supone que tiene MySQL, Python y GNUPlot.Los detalles específicos pueden ajustarse si es necesario.La publicación, de manera que podría ser un punto de referencia para otros compañeros.

Paso #1:Decidir el tipo de gráfico.

Si se trata de una trama de frecuencia de algún tipo, entonces una simple consulta SQL debe hacer el truco:

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

Si necesita especificar tamaños de bin, a continuación, continúe con el paso siguiente.

Paso #2:Asegúrese de que usted es capaz de conectarse a MySQL usando Python.Usted puede usar el import MySQLdb para ello.

Después de eso, el código de python para generar los datos de un histograma de la trama es la siguiente (esto fue escrito precisamente en 5 minutos, así que es muy crudo):

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

Paso #3:El uso de GNUPlot para generar el histograma.Puede utilizar la siguiente secuencia de comandos como un punto de partida (genera un archivo de imagen 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

Guardar la secuencia de comandos anterior en algunos de archivo arbitrario decir, de la muestra.secuencia de comandos.Continúe con el paso siguiente.

Paso #4:El uso de gnuplot con la anterior entrada de secuencia de comandos para generar un archivo eps

gnuplot sample.script

Nada complicado, pero me di cuenta de un par de bits a partir de este código se puede reutilizar.De nuevo, como he dicho, no es perfecto, pero usted puede conseguir el trabajo hecho :)

Créditos:

Otros consejos

Este artículo del blog puede ayudarle ! Se habla de estadística usando gnuplot y trazar el resultado en histograma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top