绘制直方图:如何从数据库中的数据手动创建?
我在数据库里存了一些数据,结构大概是这样的:
表名:faults
表格内容:
+------------+--------------+
| fault_type | total |
+------------+--------------+
| 1 | 1 |
| 2 | 3 |
| 3 | 8 |
| 4 | 2 |
.............................
我该怎么从这个表里生成一个直方图呢?
2 个回答
0
这篇博客文章可能对你有帮助!它讲的是如何使用gnuplot进行统计分析,并把结果绘制成直方图。
2
下面的内容假设你已经安装了MySQL、Python和GNUPlot。如果需要的话,具体细节可以进行调整。我把它发出来,希望能给其他人提供一个基础参考。
第一步:决定图表的类型。
如果你要画的是某种频率图,那么简单的SQL查询就可以搞定:
select total, count(total) from faults GROUP BY total;
如果你需要指定区间大小,那就继续到下一步。
第二步:确保你能通过Python连接到MySQL。你可以使用MySQLdb这个库来实现。
之后,生成直方图数据的Python代码如下(这段代码是在5分钟内写的,所以可能比较粗糙):
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")
第三步:使用GNUPlot生成直方图。你可以用下面的脚本作为起点(这个脚本会生成一个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
把上面的脚本保存到一个随便的文件里,比如叫sample.script。然后继续到下一步。
第四步:用gnuplot和上面的输入脚本生成一个eps文件
gnuplot sample.script
其实没什么复杂的,不过我发现这段代码里有几个部分可以重复使用。再次强调,这段代码不是完美的,但可以完成任务 :)
致谢:
Ofri Raviv(感谢他帮我解决了这篇文章中的MySQL查询问题: 获取直方图数据)
我自己(为编写Python和gnuplot脚本 :D)