ヒートマップカレンダー.


AunqueラExpresiは、N、ない干し草のque reiventar al rueda、tiene todo el sentido del mundo、Tanbi es n es cierto que si teをproveer de ruedasのロスdemの.s no no vien mal tener una idea clara de como se filan.
Nuestro objetivo de hoy , es desarrollar una function function i n qc Recurba Nuna Lista de valore dialia , de alg ant n hecho concy y y , Convuya un Calendario cl - de sico donde se Represente Las Ocurrencias de Cada d . u usando una scala de colores
Aunque Ya現存の司書は、como 7月que nos timitirを引きます.

ラ・サリダ・デ・ラ・イズキェルダの『パラノ・アルルガルノ・デモシド』Y・S・スタ・スィルピアタのインターナショナルS .
コモヘムコメンタード、Necesitaremos Matplotlibは、としては、パラの干渉のコンロ、tengamos instaladoエヌnuestro装置、crearemos un entorno仮想.
mkdir heatmap_calendar
cd heatmap_calendar
python3 -m venv venv
source venv/bin/activate
pip3 install matplotlib
Arimos NustroエディタFavorito、Pero AntesデEmpezar、UN Pequeは、o o o o o o o datdatorioです.Cualquier Imagen、エヌNuna MatizデPuntos(ピクセル)、Cada UnoデロスCuales Aoststumbraは、エスタールレジェンテナードPOR 3 valores(entre el 0 y 255 255)、que Representan La ChamdadデRoojo、Verde y Azul que Lo Componen y que Definan Su Color(Por eso SEダイスque que una una imagen rgb - se seに相当します.
nピクセルrojo serはa(255,0,0),no verde(0,255,0)y,unpunto azul seレプリメントar con(0,0,255).
Nuna Vez Visto Esto , en Tor or a a , Podter ' sエーモスDefinir Nuna Imagen Conn un C c didipareedo al Siguiente :
rojo  = (255, 0, 0)
verde = (0, 255, 0)
azul  = (0, 0, 255)
valores = [
    [rojo,  verde, azul], 
    [verde, azul,  rojo], 
    [azul,  rojo,  verde], 
]
3 x 3ピクセルrojos、verdes yアズール、colocados en diferente posiciのnを想像してください.
Matplotlib Desone de la function i n que que nos permite mostrar una imagenVamos a escribir algo de c didi y go que pasa :
import matplotlib.pyplot as plt

rojo  = (255, 0, 0)
verde = (0, 255, 0)
azul  = (0, 0, 255)

valores = [
    [rojo,  verde, azul], 
    [verde, azul,  rojo], 
    [azul,  rojo,  verde], 
]

# Creamos el lienzo sobre el que dibujar las gráficas
fig, ax = plt.subplots()

# Mostramos la imagen que hemos definido
ax.imshow(valores)
plt.show()

ボイル!Tenemos lo queは、エーモスは、3 x 3のピクセルは、3 x 3のピクセルを想像します.
カラ・コン・アイドレテンの色彩に関する一考察
ヘスタ・エル・モメント、ヘートスTrabajado Con Nuna Imagen RGBデ色、enエルque elカラーデCadaピクセル(Cuadradito)Eestは、3つのvalore、que indican la比例詞n nデロジョ、verde y azul que lo component(todos los colores se pueden conseguir sumando estos tres en su比例詞n adecuada)です.
遺伝子の色のフエルナナrealidad、ラスimの遺伝子は、エヌのブランコy neegy y seレプレッシブンコンニャである.
vamos a変則的なnestro c . digo,para que viaje atr es s en el tiempo,y vamos a representar cada no no nnuestros cuadraditos con unno nico valor
import matplotlib.pyplot as plt

valores = [
    [0, 175, 255], 
    [175, 255, 0], 
    [255, 0, 175], 
]

fig, ax = plt.subplots()

# Indicamos a la función que la imagen es de escala de grises en lugar RGB (cmap='gray')
ax.imshow(valores, cmap='gray')
plt.show()

Nuestro Cは、diigg sigcifunonando y、ya tenemos otraデlas cosas que necesitamos、Representar una cuadrは、cula、en la que el color de cada elemento representa unvalor具体的です.
西暦3×3 , 7 , 6 , 7 , 6 ,エーモスの表現:エーモス・レールマンの所説
問題点と問題点エストは、ティモメート、グリースのAnostumbra A ' s SER Demasiado agradable y、Cada Cuadrado sのPero Lo Permite Representar Valoresは、0 y 255(que s - DEN LN Permitidos para - una Imagen)に入ります.
Afortuneamenamenteは、メトロcmap que nos permite特別なna una paletaデcolores diferentes y、ロスparのメトロvvn y vmax que、como probalemente ya - habrによって、deducido、nos permiten pecificerエルRangoデValoreにResientarを与えます.
import matplotlib.pyplot as plt

valores = [
    [10, 20, 30, 40, 50, 60, 70], 
    [20, 30, 40, 50, 60, 70, 10], 
    [30, 40, 50, 60, 70, 10, 20], 
    [40, 50, 60, 70, 10, 20, 30], 
    [50, 60, 70, 10, 20, 30, 40], 
    [60, 70, 10, 20, 30, 40, 50], 
]

fig, ax = plt.subplots()

# Especificamos paleta de colores a usar y rango de valores a representar.
ax.imshow(valores, cmap='YlGn', vmin=0, vmax=100)
plt.show()

エスト・イ・エテンピアザテナーCierto Parecido Catラスimは、エジェーポモ・モストラダスas inicioに遺伝子を与えます.として、Vamos Colorcarle el nombre de un mes、de la semana yとしてのLine d Las d .
import matplotlib.pyplot as plt

# Lista de etiquetas para representar los días de la semana.
dias_semana = ['L', 'M', 'M', 'J', 'V', 'S', 'D']
valores = [
    [10, 20, 30, 40, 50, 60, 70], 
    [20, 30, 40, 50, 60, 70, 10], 
    [30, 40, 50, 60, 70, 10, 20], 
    [40, 50, 60, 70, 10, 20, 30], 
    [50, 60, 70, 10, 20, 30, 40], 
    [60, 70, 10, 20, 30, 40, 50], 
]

fig, ax = plt.subplots()

ax.imshow(valores, cmap='YlGn', vmin=0, vmax=100)
# Colocamos el título
ax.set_title("Enero\n")

# Borramos el contenido de las etiquetas del eje Y 
ax.set_yticklabels([])

# Indicamos las posiciones posiciones del ejs X con las que secorresponden las etiquetas.
ax.set_xticks([0, 1, 2, 3, 4, 5, 6])

# Especificamos las etiquetas para las posiciones especificadas anteriormente.
ax.set_xticklabels(dias_semana)
plt.show()

ヤーEstamos m - s s cerca、pero tenemos queムーバラスd dロスは、La Parte優れたYとして、美人エルマルコデAlrededor que quedarを得ます.
import matplotlib.pyplot as plt

dias_semana = ['L', 'M', 'M', 'J', 'V', 'S', 'D']
valores = [
    [10, 20, 30, 40, 50, 60, 70], 
    [20, 30, 40, 50, 60, 70, 10], 
    [30, 40, 50, 60, 70, 10, 20], 
    [40, 50, 60, 70, 10, 20, 30], 
    [50, 60, 70, 10, 20, 30, 40], 
    [60, 70, 10, 20, 30, 40, 50], 
]

fig, ax = plt.subplots()

ax.imshow(valores, cmap='YlGn', vmin=0, vmax=100)
ax.set_title("Enero\n")
ax.set_yticklabels([])
ax.set_xticks([0, 1, 2, 3, 4, 5, 6])
ax.set_xticklabels(dias_semana)

# Colocamos las etiquetas del eje X en la parte superior
ax.xaxis.tick_top()

# Ocultamo cada uno de lso dados que circundan el gráfico
for lado in ['left', 'right', 'bottom', 'top']:
    ax.spines[lado].set_visible(False)

plt.show()

アホラ,イヤの変わり者における虚構の虚構
import numpy as np
import matplotlib.pyplot as plt

# Colocaremos el valor especial de Not a Number a las cassila que sobran y 
# conseguiremos que maptlotlib no las muestre
NA = np.nan

dias_semana = ['L', 'M', 'M', 'J', 'V', 'S', 'D']
valores = [
    [NA, NA, NA, NA, NA, 60, 70], 
    [20, 30, 40, 50, 60, 70, 10], 
    [30, 40, 50, 60, 70, 10, 20], 
    [40, 50, 60, 70, 10, 20, 30], 
    [50, 60, 70, 10, 20, 30, 40], 
    [60, NA, NA, NA, NA, NA, NA], 
]

fig, ax = plt.subplots()

ax.imshow(valores, cmap='YlGn', vmin=0, vmax=100)
ax.set_title("Enero\n")
ax.set_yticklabels([])
ax.set_xticks([0, 1, 2, 3, 4, 5, 6])
ax.set_xticklabels(dias_semana)
ax.xaxis.tick_top()

# Reducimos la longitud de las marcas a 0 para que no sean visibles
ax.tick_params(axis=u'both', which=u'both', length=0)
for lado in ['left', 'right', 'bottom', 'top']:
    ax.spines[lado].set_visible(False)

plt.show()

yパラacabarは、apadio unpequeのo petalle o detalle estのtico.
import numpy as np
import matplotlib.pyplot as plt

NA = np.nan

dias_semana = ['L', 'M', 'M', 'J', 'V', 'S', 'D']
valores = [
    [NA, NA, NA, NA, NA, 60, 70], 
    [20, 30, 40, 50, 60, 70, 10], 
    [30, 40, 50, 60, 70, 10, 20], 
    [40, 50, 60, 70, 10, 20, 30], 
    [50, 60, 70, 10, 20, 30, 40], 
    [60, NA, NA, NA, NA, NA, NA], 
]

fig, ax = plt.subplots()

ax.imshow(valores, cmap='YlGn', vmin=0, vmax=100)
ax.set_title("Enero\n")
ax.set_yticklabels([])
ax.set_xticks([0, 1, 2, 3, 4, 5, 6])
ax.set_xticklabels(dias_semana)
ax.xaxis.tick_top()

ax.tick_params(axis=u'both', which=u'both', length=0)
for lado in ['left', 'right', 'bottom', 'top']:
    ax.spines[lado].set_visible(False)

# Indicamos las posiciones donde dibujaremos la rejilla    
ax.set_xticks([-0,5, 0.5, 1.5, 2.5, 3.5, 4.5, 5.5, 6.5], minor=True)
ax.set_yticks([-0,5, 0.5, 1.5, 2.5, 3.5, 4.5, 5,5], minor=True)
# Dibujamos la rejilla de color blanco para que actue como separador.
ax.grid(which='minor', color='w', linestyle='-', linewidth=2)

plt.show()

y ya lo tenemosUn Med , Un Serie de valores Upzzando un C . de Digo de ColoresにおけるHEN
Ya hemos explicado lo que podrの結果LO que quedaは、esを繰り返します.
import calendar
import numpy as np
import matplotlib.pyplot as plt

def heatmap_calendar(year, valores):

    dias_semana = ['L', 'M', 'M', 'J', 'V', 'S', 'D']
    nombres_meses = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre']
    maximo_semanas_mes = 6
    meses = 12
    columnas = 3
    filas = 4

    # Creamos un gráfico para cada més del año
    fig, ax = plt.subplots(filas, columnas, figsize=(3.5*columnas, 3.5*filas))

    # Para facilitar la iteración convertimos la tabla 2D en una lista 1D
    axs = np.array(ax).reshape(-1)

    numero_valores = len(valores)
    maximo = max(valores)
    puntero_dia_actual = 0

    # Repetimos el proceso para cada mes
    for mes in range(meses):
        # Averiguamos que día de la semana empieza el mes y cuantos días tiene
        dia_semana, dias_mes = calendar.monthrange(year, mes + 1)

        # Creamos un array nullo como plantilla para ir colocando los valores del mes
        plantilla_mes = np.empty((maximo_semanas_mes, len(dias_semana)))
        plantilla_mes[:] = np.nan

        # Mostramos nombre del mes
        axs[mes].set_title(nombres_meses[mes]+'\n', fontsize=12)

        # Colocamos etiqueta de días de la semana.
        axs[mes].set_xticks(np.arange(len(dias_semana)))
        axs[mes].set_xticklabels(dias_semana, fontsize=10, fontweight='bold', color='#555555')
        axs[mes].set_yticklabels([])
        axs[mes].xaxis.tick_top()

        # Ocultamos las marcas de los ejes
        axs[mes].tick_params(axis=u'both', which=u'both', length=0)  # remove tick marks

        # Dibujamos rejilla blanca para separar casillas
        axs[mes].set_xticks(np.arange(-.5, len(dias_semana), 1), minor=True)
        axs[mes].set_yticks(np.arange(-.5, maximo_semanas_mes, 1), minor=True)
        axs[mes].grid(which='minor', color='w', linestyle='-', linewidth=2)

        # Ocultamos cada uno de los lados del marco que rodea la cuadrícula.
        for lado in ['left', 'right', 'bottom', 'top']:
            axs[mes].spines[lado].set_visible(False)

        # Empezamos a rellenar cada mes desde la primera fila y desde el día de la
        # semana en la que empieza el mes        
        fila = 0
        columna = dia_semana

        # Copiamos tantos valores de nuestra lista como días tiene el mes
        for n in range(dias_mes):
            if puntero_dia_actual < numero_valores:
                plantilla_mes[fila][columna] = valores[puntero_dia_actual]

            # Conservamos cual es el próximo valor de nuestra lista a procesar
            puntero_dia_actual += 1

            # Controlamos cuando se produce cambio de semana
            if columna == 6:
                columna = 0
                fila +=1
            else:
                columna += 1

        # Mostramos los valores del mes        
        axs[mes].imshow(plantilla_mes, cmap='YlGn', vmin=1, vmax=maximo)

    # Colocamos el año del calendario y reajustamos el conjunto para dejas
    # un pequeño margen alrededor        
    fig.suptitle("\n" + str(year), fontsize=16)
    plt.subplots_adjust(left=0.04, right=0.96, top=0.88, bottom=0.04)

    # La visualización online es correcta en el caso de jupyter notebook, pero hay solapamientos
    # incorrectos si lo vemos directamente con el visor de matplotlib. Salvamos en un documento PDF
    # para tener la salida correcta
    plt.savefig('heatmap_calendar.pdf')
    plt.show()

if __name__ == '__main__':
    # Generamos valores aleatorios para probar la función
    valores = np.random.randint(500, size=365)
    heatmap_calendar(2021, valores=valores)


Vees , Ventes , Ventes , Tenne bastantes similitudes con la magiaLo queはpaeceを無視します、Hasta que Alguien TEは、エルTruco y Piensasを探検します.
ヘモス・モストラード・ラ・ヴェルシィの研究(その1 )