Plotten Histogramm:Wie kann ich es tun, von Grund auf, mit in einer Datenbank gespeicherten Daten?
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?
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:
Ofri Raviv (for helping me out mit die MySQL-Abfrage in diesem Beitrag:Erste Daten für das Histogramm-plot)
Mich (für das schreiben von python-und gnuplot-Skript aus :D)
Andere Tipps
Dieser Blog-Artikel können Sie helfen ! Er spricht über Statistik mit gnuplot und zeichnet das Ergebnis in Histogramm.