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.

Cómo contar el número de repeticiones de un elemento en una lista que es un valor en un diccionario?

Así que tengo un diccionario (dictionary2) donde cada valor es una lista. Necesito crear una función que muestre estos datos en un gráfico, con las claves en el eje x, lo cual ya he logrado. Quiero crear una lista separada (count_list) que contenga las frecuencias de cada número repetido dentro de la lista correspondiente a una clave determinada (solo una lista separada para todos los valores del diccionario juntos). El objetivo final es crear un gráfico de dispersión donde los marcadores superpuestos sean más grandes, lo cual podría hacer asignando esta lista separada al argumento ‘s’ en la llamada al gráfico de dispersión. (Tenga en cuenta que un color diferente o algo similar también funcionaría, pero de todas formas se requeriría la lista count_list).

Tengo una versión funcional que no tiene en cuenta la superposición (esto puede dar un contexto, ver a continuación).

Actualmente estoy intentando crear la lista count_list con el siguiente código (lo saqué de la función para mayor comodidad en los experimentos):

count_list=[]
for key in dictionary2:
    for value in dictionary2:
        for M in value:
            count= value.count(M)
            count_list.append(count)

Esto devuelve una lista count_list con la misma secuencia de números repetidos para cada clave. Me doy cuenta de que mi código probablemente es demasiado simple, así que no me sorprende que no haya funcionado. Sin embargo, no estoy seguro de qué hacer a partir de aquí y no entiendo por qué se ve así la salida.

La trama actual se ve así:

def plot_dict(dataset):
    # Transformando los datos para que se lean correctamente en el gráfico
    d = dataset
    x = []
    y = []
    for k, v in d.items():
        x.extend(list(itertools.repeat(k, len(v))))
        y.extend(v)

    plt.figure(figsize=(30,30))
    plt.plot(x, y, '.')
    plt.title('Gráfico de FASTA', fontsize=45)
    plt.xlabel('IDs de secuencia', fontsize=30)
    plt.ylabel('Peso molecular', fontsize=30)
    plt.xticks(fontsize=15)
    plt.yticks(fontsize=15)
plot_dict(dictionary2)

(Estoy usando JupyterLab 3.0.14).

Esta es la primera vez que publico una pregunta en Stack Overflow, así que si violé alguna etiqueta o si algo en mi explicación del problema no fue claro, ¡por favor avísenme!

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para solucionar el problema con count_list, debes iterar sobre los valores de cada clave en lugar de las propias claves. Puedes hacer esto cambiando el bucle interno para iterar sobre dictionary2[key] en lugar de dictionary2. Además, puedes crear un diccionario para almacenar las cuentas de cada número en la lista de cada clave, y luego agregar los valores a count_list al final de cada iteración. Aquí tienes el código revisado:

    count_dict = {}
    for key in dictionary2:
        count_dict[key] = {}
        for value in dictionary2[key]:
            if value not in count_dict[key]:
                count_dict[key][value] = 1
            else:
                count_dict[key][value] += 1
        for count in count_dict[key].values():
            count_list.append(count)
    

    Esto debería darte una count_list que contiene las cuentas para cada número en todas las listas juntas, sin repetir la secuencia de números para cada clave.

    Para implementar el gráfico de dispersión con tamaños de marcador variables según la superposición, puedes pasar el argumento s a la función scatter como count_list, y luego ajustar el parámetro alpha para controlar la transparencia de los marcadores. Aquí tienes un ejemplo de cómo podrías modificar la función plot_dict para crear este tipo de gráfico de dispersión:

    def plot_dict(dataset):
        x = []
        y = []
        counts = []
        for k, v in dataset.items():
            x.extend(list(itertools.repeat(k, len(v))))
            y.extend(v)
            count_dict = {}
            for num in v:
                if num not in count_dict:
                    count_dict[num] = 1
                else:
                    count_dict[num] += 1
            for count in count_dict.values():
                counts.append(count)
        plt.figure(figsize=(10,10))
        plt.scatter(x, y, s=counts, alpha=0.5)
        plt.title('Gráfico de dispersión con tamaño de marcador variable', fontsize=16)
        plt.xlabel('Claves', fontsize=12)
        plt.ylabel('Valores', fontsize=12)
    

    Esta función debería producir un gráfico de dispersión con marcadores cuyos tamaños varían según con qué frecuencia aparece el valor correspondiente en todas las listas juntas. Puedes ajustar el parámetro alpha para hacer los marcadores más o menos opacos, según tus preferencias.

Comments are closed.