es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear un histograma en Python.

Estoy tratando de crear un histograma en Python.

Mi función es la siguiente:

    def hist_hor(diccionario):
        dict={}

        for e in diccionario:
            if e in dict:
                dict[e] += '*'
            else:
                dict[e] = '*'

        for i in sorted(dict):
            print(f'{i}: {dict[i]}')

histograma_horizontal(d)

Se supone que debería lucir así:

a: *****
b: **********
c: ************
d: ***********
e: ***************
f: ********************
g: ***************
h: *********
i: *******
j: **

Pero con mi función se ve así:

a: *
b: *
c: *
d: *
e: *
f: *
g: *
h: *
i: *
j: *

Además, ¿alguien sabe cómo representarlo de esta manera también?:

          *
          *
          *
          *
        * * *
        * * *
        * * *
    *   * * *
    * * * * *



Tags:  ,

Answer

  1. Avatar for davy.ai

    Para crear un histograma en Python, puedes usar la función hist incorporada en la biblioteca matplotlib o crear tu propia función, como la que se presenta en la pregunta.

    La función proporcionada hist_hor toma un diccionario como entrada y genera un histograma horizontal contando la frecuencia de las llaves y representándolas con asteriscos.

    El problema con la implementación actual es que siempre asigna '*' a cada llave, independientemente de su frecuencia, mientras que debería agregar un asterisco más cada vez que aparece la llave.

    Para solucionar esto, puedes modificar la declaración if en el bucle for para incrementar el valor correspondiente en el diccionario en lugar de asignar un valor fijo:

    if e in dict:
        dict[e] += '*'
    else:
        dict[e] = '*'
    

    De esta manera, cada vez que se encuentra una llave, se agrega un asterisco al valor de la llave en el diccionario.

    Para mostrar el histograma verticalmente, puedes usar la siguiente función:

    def hist_ver(diccionario):
        valores = sorted(diccionario.values(), reverse=True)
        max_valor = valores[0]
        for i in range(max_valor, 0, -1):
            fila = ''
            for valor in valores:
                if valor >= i:
                    fila += '*'
                else:
                    fila += ' '
            print(fila)
        print('-'*len(diccionario))
        etiquetas = sorted(diccionario.keys())
        for etiqueta in etiquetas:
            print(etiqueta, end='')
        print('')
    

    Esta función ordena los valores en orden descendente y los recorre para generar cada fila del histograma. Si el valor actual es mayor o igual al número de fila actual, agrega un asterisco; de lo contrario, agrega un espacio.

    Para alinear las etiquetas con el histograma, se imprime una línea separadora y las llaves ordenadas al final.

    Para usar esta función, simplemente llama a hist_ver(d) con un diccionario d que contenga las frecuencias a mostrar. El resultado será un histograma vertical como el mostrado en la pregunta.

Comments are closed.