Plotting Histogram: Como posso fazer isso do zero usando dados armazenados em um banco de dados?

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

Pergunta

Eu tenho alguns dados armazenados em um banco de dados como este:

TableName: Tabela de falhas:

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

Como devo obter um enredo de histograma a partir desta tabela?

Foi útil?

Solução

A solução abaixo pressupõe que você tenha MySQL, Python e GnePlot. Os detalhes específicos podem ser ajustados, se necessário. Publicá -lo para que possa ser uma linha de base para outros colegas.

Etapa 1: decida o tipo de gráfico.

Se for algum tipo de gráfico de frequência, uma consulta SQL simples deve fazer o truque:

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

Se você precisar especificar tamanhos de bin, prossiga para a próxima etapa.

Etapa 2: verifique se você pode se conectar ao MySQL usando o Python. Você pode usar o MySQLDB Import para fazer isso.

Depois disso, o código Python para gerar dados para um gráfico de histograma é o seguinte (este foi escrito com precisão em 5 minutos, por isso é muito grosseiro):

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

Etapa 3: use o GNUplot para gerar o histograma. Você pode usar o seguinte script como ponto de partida (gera um arquivo de imagem 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

Salve o script acima em algum arquivo arbitrário, digamos, sample.script. Prossiga para o próximo passo.

Etapa 4: Use o GNUPLOT com o script de entrada acima para gerar um arquivo EPS

gnuplot sample.script

Nada complicado, mas achei que alguns bits deste código podem ser reutilizados. Novamente, como eu disse, não é perfeito, mas você pode fazer o trabalho :)

Créditos:

Outras dicas

Este artigo do blog Pode ajudá -lo! Ele fala sobre estatística usando GNUplot e plote o resultado em histograma.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top