Tracciare l'istogramma:Come posso farlo da zero utilizzando i dati archiviati in un database?
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?
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:
Ofri Raviv (per avermi aiutato con la domanda MySQL in questo post:Ottenere dati per il grafico dell'istogramma)
Io stesso (per aver scritto la sceneggiatura di Python e Gnuplot: D)
Altri suggerimenti
questo articolo del blog può aiutare ! Si parla di statistica utilizzando gnuplot e tracciare il risultato in istogramma.