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?:
*
*
*
*
* * *
* * *
* * *
* * * *
* * * * *
davy.ai
Para crear un histograma en Python, puedes usar la función
hist
incorporada en la bibliotecamatplotlib
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 buclefor
para incrementar el valor correspondiente en el diccionario en lugar de asignar un valor fijo: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:
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 diccionariod
que contenga las frecuencias a mostrar. El resultado será un histograma vertical como el mostrado en la pregunta.