Traçage de l'histogramme :Comment puis-je le faire à partir de zéro en utilisant des données stockées dans une base de données ?

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

Question

J'ai des données stockées dans une base de données comme celle-ci :

Nom de la table:Tableau des défauts:

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

Comment suis-je censé obtenir un histogramme à partir de ce tableau ?

Était-ce utile?

La solution

La solution ci-dessous suppose que vous disposez de MySQL, Python et GNUPlot.Les détails spécifiques peuvent être affinés si nécessaire.Le publier afin qu'il puisse servir de référence pour d'autres pairs.

Étape 1:Décidez du type de graphique.

S'il s'agit d'un tracé de fréquence, une simple requête SQL devrait faire l'affaire :

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

Si vous devez spécifier des tailles de bac, passez à l'étape suivante.

Étape 2:Assurez-vous que vous pouvez vous connecter à MySQL à l'aide de Python.Vous pouvez utiliser l'importation MySQLdb pour ce faire.

Après cela, le code python pour générer des données pour un tracé d'histogramme est le suivant (cela a été écrit précisément en 5 minutes donc c'est très brut) :

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

Étape 3:Utilisez GNUPlot pour générer l'histogramme.Vous pouvez utiliser le script suivant comme point de départ (génère un fichier image 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

Enregistrez le script ci-dessus dans un fichier arbitraire, par exemple sample.script.Passez à l'étape suivante.

Étape 4:Utilisez gnuplot avec le script d'entrée ci-dessus pour générer un fichier eps

gnuplot sample.script

Rien de compliqué mais j'ai pensé que quelques bits de ce code pouvaient être réutilisés.Encore une fois, comme je l'ai dit, ce n'est pas parfait mais vous pouvez faire le travail :)

Crédits:

Autres conseils

Cet article de blog peut vous aider ! Il parle de statistique en utilisant gnuplot et tracer le résultat dans l'histogramme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top