¿Cómo graficar un Histograma en Python?

In [1]:
import matplotlib.pyplot as plt

datos = [1,2,2,3,3,5,1,2,5,2,4,5]

plt.title('Ejemplo') #titulo
plt.hist(datos,bins=5) #datos, grupos
plt.show()
plt.clf()

¿Qué es un histograma?

Un histograma es una representación gráfica de una variable en forma de barras, donde la superficie de cada barra es proporcional a la frecuencia de los valores representados.[101]

Usando matplotlib para graficar el Histograma

Matplotlib es una biblioteca completa para crear visualizaciones estáticas, animadas e interactivas en Python. [102]

In [ ]:
# Ponemos el títulos
plt.title('Ejemplo')

# Usamos hist() para graficar el histograma [103]
# indicamos que datos usar para graficar,
# y cuantos grupos crear
plt.hist(datos,bins=5)

# Indicamos que muestre la imagen
plt.show()

# Limpiar la figura actual
plt.clf()

Podemos usar distintas configuraciones para mostrar el gráfico

In [ ]:
# parametros para hist()
plt.hist(
    datos, # los datos a usar
    bins=5, # cuantos grupos crear
    color='red' #color de las barras
    linewidth=2, # tamaño de los bordes
    edgecolor = 'black', # el color de los border
)

# Indicar que muestre el recuadro sobre la imagen
plt.grid(True)

El código completo sería:

In [27]:
import matplotlib.pyplot as plt

datos = [1,2,2,3,3,5,1,2,5,2,4,5]

plt.title('Ejemplo') #titulo
plt.hist(
    datos,
    bins=5,
    color='red',
    edgecolor = 'black',
    linewidth=2
)
plt.grid(True)
plt.show()
plt.clf()

Cambiando algunos valores tenemos:

In [37]:
import matplotlib.pyplot as plt

datos = [1,2,2,3,3,5,1,2,5,2,4,5]

plt.title('Ejemplo') #titulo
plt.hist(
    datos,
    bins=5,
    color='red',
    edgecolor = 'black',
    linewidth=1
)
# plt.grid(True)
plt.show()
plt.clf()

Mostrar más de un Histograma

In [48]:
import matplotlib.pyplot as plt

datos = [1,2,2,3,3,5,1,2,5,2,4,5]

plt.subplot(121)
plt.title('Histograma 1') #titulo
plt.hist(datos,bins=5)

plt.subplot(122)
plt.title('Histograma 2') #titulo
plt.hist(datos,bins=3,color="red")
plt.grid(True)

plt.show()
plt.clf()

[301]

También podemos usar el siguiente código:

In [74]:
import matplotlib.pyplot as plt

datos = [1,2,2,3,3,5,1,2,5,2,4,5]

fig, axs = plt.subplots(1, 2)

axs[0].hist(datos,bins=5)
axs[1].hist(datos,bins=3,color="red")

plt.show()
plt.clf()
<matplotlib.figure.Figure at 0x7f0f3e19d668>

[201]

Graficar un Histograma en 2D

In [76]:
import matplotlib.pyplot as plt

datos = [1,2,2,3,3,5,1,2,5,2,4,5]

fig, axs = plt.subplots()
hist = axs.hist2d(datos,datos)

plt.show()
plt.clf()
<matplotlib.figure.Figure at 0x7f0f3d854ef0>
In [91]:
import matplotlib.pyplot as plt

x = [1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4]
y = [2,3,4,1,1,3,3,2,3,4,1,1,3,2,1,2]

fig, axs = plt.subplots()
hist = axs.hist2d(x,y)

plt.show()
plt.clf()
<matplotlib.figure.Figure at 0x7f0f3dfd0a20>

Si usamos random, para generar números aleatorios tenemos

In [113]:
import matplotlib.pyplot as plt
import random

random.seed(1234)
n = 100
x = [random.randint(0,x) for x in range(n)]
y = [random.randint(0,x) for x in range(n)]

fig, axs = plt.subplots()
hist = axs.hist2d(x,y)

plt.show()
plt.clf()
<matplotlib.figure.Figure at 0x7f0f3d7c5c88>

¿Cómo sumar los números impares en un triángulo con Python?

Se quieres sumar los números impares, que tienen la siguiente distribución

      1
     3 5
   7 9 11
 13 15 17 19
 ...

Para entender la lógica, primero definimos una función que nos muestre estos números:

In [1]:
def imprimir(n):
    fila = 1
    cantidad_fila = 1 # cuantos numeros hay en la fila
    numero_inicio = 1 # el numero de inicio
    while fila <= n:
        s = ''
        for i in range(fila):
            s += ' '+str(numero_inicio)
            numero_inicio += 2
        print(s)
        fila += 1
        cantidad_fila += 1
imprimir(9)
 1
 3 5
 7 9 11
 13 15 17 19
 21 23 25 27 29
 31 33 35 37 39 41
 43 45 47 49 51 53 55
 57 59 61 63 65 67 69 71
 73 75 77 79 81 83 85 87 89

Podemos reducir la función teniendo en cuenta que fila y cantidad_fila, siempre son iguales:

In [2]:
def imprimir(n):
    fila = 1 # inica la fila actual, y cuantes elementos hay
    numero_inicio = 1 # el numero de inicio
    while fila <= n:
        s = ''
        for i in range(fila):
            s += ' '+str(numero_inicio)
            numero_inicio += 2
        print(s)
        fila += 1
imprimir(4)
 1
 3 5
 7 9 11
 13 15 17 19

Sumar todos los elementos hasta la fila n

Tomando como referencia la funcion imprimir(), definimos la siguiente función

In [14]:
def sumar_todo(n):
    fila = 1 # inica la fila actual, y cuantes elementos hay
    numero_inicio = 1 # el numero de inicio
    ans = 0 # suma en la fila n
    while fila <= n:
        for i in range(fila):
            ans += numero_inicio # aqui sumamos la fila
            numero_inicio += 2
        fila += 1
    return ans
sumar_todo(3)
Out[14]:
36
In [15]:
for x in range(5):
    ans = sumar_todo(x)
    print(ans)
0
1
9
36
100

Sumar los elementos de una fila

Para sumar los números de una fila, declaramos la siguiente función con similar lógica

In [7]:
def sumar_fila(n):
    fila = 1 # inica la fila actual, y cuantes elementos hay
    numero_inicio = 1 # el numero de inicio
    ans = 0 # suma en la fila n
    while fila <= n:
        for i in range(fila):
            if n == fila:
                ans += numero_inicio # aqui sumamos la fila
            numero_inicio += 2
        fila += 1
    return ans
sumar_fila(4)
Out[7]:
64

Veamos las suma de las primeras 10 filas

In [8]:
for x in range(10):
    ans = sumar_fila(x)
    print(ans)
0
1
8
27
64
125
216
343
512
729

Vemos que cada número es un cubo perfecto, entonces si sacamos su raiz cúbica tenemos:

In [9]:
import math
for x in range(10):
    ans = sumar_fila(x)
    print(ans,math.pow(ans,1/3))
0 0.0
1 1.0
8 2.0
27 3.0
64 3.9999999999999996
125 4.999999999999999
216 5.999999999999999
343 6.999999999999999
512 7.999999999999999
729 8.999999999999998

Es decir para la fila $n$ la suma en dicha fila es $n^3$