Upload 3 files
Browse files- Mind Mapp.jpg +0 -0
- app.py +320 -0
- requirements.txt +7 -0
Mind Mapp.jpg
ADDED
|
app.py
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import networkx as nx
|
| 4 |
+
from pyvis.network import Network
|
| 5 |
+
from PIL import Image
|
| 6 |
+
import base64
|
| 7 |
+
import io
|
| 8 |
+
import json
|
| 9 |
+
import streamlit.components.v1 as components
|
| 10 |
+
|
| 11 |
+
|
| 12 |
+
# Inicializar la sesi贸n de estado para almacenar la estructura del mapa mental
|
| 13 |
+
if 'mapa_mental' not in st.session_state:
|
| 14 |
+
st.session_state['mapa_mental'] = {
|
| 15 |
+
'nombre': '',
|
| 16 |
+
'imagen': '',
|
| 17 |
+
'ramas': []
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
# Definir colores para las categor铆as
|
| 21 |
+
categoria_colores = ['#1f77b4', '#2ca02c', '#9467bd', '#bcbd22', '#ff7f0e', '#d62728']
|
| 22 |
+
|
| 23 |
+
# Funci贸n para convertir imagen a base64
|
| 24 |
+
def get_image_base64(image_data):
|
| 25 |
+
"""
|
| 26 |
+
Convierte una imagen en base64.
|
| 27 |
+
Puede manejar im谩genes en formato base64, objetos PIL o bytes.
|
| 28 |
+
"""
|
| 29 |
+
if isinstance(image_data, str) and image_data.startswith("data:image"): # Si ya es base64
|
| 30 |
+
return image_data
|
| 31 |
+
elif isinstance(image_data, Image.Image): # Si la imagen es un objeto PIL
|
| 32 |
+
buffered = io.BytesIO()
|
| 33 |
+
image_data = image_data.resize((150, 150)) # Ajustar tama帽o de la imagen a 150x150 p铆xeles
|
| 34 |
+
image_data.save(buffered, format="PNG") # Convertir imagen a bytes
|
| 35 |
+
return "data:image/png;base64," + base64.b64encode(buffered.getvalue()).decode("utf-8")
|
| 36 |
+
elif isinstance(image_data, bytes): # Si es un archivo cargado
|
| 37 |
+
buffered = io.BytesIO(image_data)
|
| 38 |
+
image = Image.open(buffered).resize((150, 150))
|
| 39 |
+
buffered = io.BytesIO()
|
| 40 |
+
image.save(buffered, format="PNG")
|
| 41 |
+
return "data:image/png;base64," + base64.b64encode(buffered.getvalue()).decode("utf-8")
|
| 42 |
+
return None
|
| 43 |
+
|
| 44 |
+
# Funci贸n para agregar una nueva rama a un nodo espec铆fico
|
| 45 |
+
def agregar_rama(nodo):
|
| 46 |
+
"""
|
| 47 |
+
A帽ade una nueva rama a un nodo dado.
|
| 48 |
+
"""
|
| 49 |
+
nueva_rama = {
|
| 50 |
+
'nombre': '',
|
| 51 |
+
'imagen': '',
|
| 52 |
+
'ramas': []
|
| 53 |
+
}
|
| 54 |
+
nodo['ramas'].append(nueva_rama)
|
| 55 |
+
|
| 56 |
+
# Funci贸n recursiva para renderizar el formulario de cada rama
|
| 57 |
+
def renderizar_ramas(nodo, ruta):
|
| 58 |
+
"""
|
| 59 |
+
Renderiza un formulario en el sidebar para una rama espec铆fica.
|
| 60 |
+
Permite ingresar el nombre y la imagen, y agregar sub-ramas.
|
| 61 |
+
"""
|
| 62 |
+
for idx, rama in enumerate(nodo['ramas']):
|
| 63 |
+
nueva_ruta = f"{ruta} -> Rama {idx + 1}"
|
| 64 |
+
st.sidebar.markdown(f"### Nodo: {nueva_ruta}")
|
| 65 |
+
|
| 66 |
+
# Entrada de texto para el nombre
|
| 67 |
+
nombre = st.sidebar.text_input(f"Nombre de la idea en {nueva_ruta}", value=rama['nombre'], key=f"nombre_{nueva_ruta}")
|
| 68 |
+
rama['nombre'] = nombre
|
| 69 |
+
|
| 70 |
+
# Entrada para la imagen
|
| 71 |
+
imagen = st.sidebar.file_uploader(f"Cargar imagen para {nueva_ruta}", type=["png", "jpg", "jpeg"], key=f"imagen_{nueva_ruta}")
|
| 72 |
+
if imagen:
|
| 73 |
+
imagen_base64 = get_image_base64(imagen.read())
|
| 74 |
+
rama['imagen'] = imagen_base64
|
| 75 |
+
elif not rama['imagen']:
|
| 76 |
+
rama['imagen'] = ''
|
| 77 |
+
|
| 78 |
+
# Bot贸n para agregar una sub-rama
|
| 79 |
+
if st.sidebar.button(f"Agregar rama a {nueva_ruta}", key=f"boton_agregar_{nueva_ruta}"):
|
| 80 |
+
agregar_rama(rama)
|
| 81 |
+
|
| 82 |
+
# Llamar recursivamente para renderizar sub-ramas
|
| 83 |
+
renderizar_ramas(rama, nueva_ruta)
|
| 84 |
+
|
| 85 |
+
# Funci贸n recursiva para agregar nodos al grafo
|
| 86 |
+
def agregar_nodos_recursivamente(G, nodo, datos, color, edge_width_dict):
|
| 87 |
+
"""
|
| 88 |
+
A帽ade nodos y edges al grafo de manera recursiva.
|
| 89 |
+
"""
|
| 90 |
+
nombre = datos["nombre"]
|
| 91 |
+
imagen = datos.get("imagen", None)
|
| 92 |
+
G.add_node(nombre, type='central' if nodo == "root" else 'ramificado', image=imagen if imagen else None, color=color)
|
| 93 |
+
|
| 94 |
+
if nodo != "root":
|
| 95 |
+
G.add_edge(nodo, nombre, color=color, width=edge_width_dict.get(nodo, 1))
|
| 96 |
+
|
| 97 |
+
ramas = datos.get("ramas", [])
|
| 98 |
+
num_ramas = len(ramas)
|
| 99 |
+
edge_width = max(1, 5 - num_ramas) # Ajusta el grosor seg煤n el n煤mero de ramas
|
| 100 |
+
edge_width_dict[nombre] = edge_width
|
| 101 |
+
|
| 102 |
+
# Asignar color
|
| 103 |
+
if color in categoria_colores:
|
| 104 |
+
color_index = (categoria_colores.index(color) + 1) % len(categoria_colores)
|
| 105 |
+
nuevo_color = categoria_colores[color_index]
|
| 106 |
+
else:
|
| 107 |
+
nuevo_color = 'gray'
|
| 108 |
+
|
| 109 |
+
for rama in ramas:
|
| 110 |
+
agregar_nodos_recursivamente(G, nombre, rama, nuevo_color, edge_width_dict)
|
| 111 |
+
|
| 112 |
+
# Funci贸n para crear el grafo
|
| 113 |
+
def crear_grafico_mind_map(datos_entrada):
|
| 114 |
+
"""
|
| 115 |
+
Crea y visualiza el grafo del mapa mental usando Pyvis.
|
| 116 |
+
"""
|
| 117 |
+
G = nx.Graph()
|
| 118 |
+
edge_width_dict = {}
|
| 119 |
+
|
| 120 |
+
if not datos_entrada['nombre']:
|
| 121 |
+
st.warning("Por favor, ingresa la idea principal.")
|
| 122 |
+
return
|
| 123 |
+
|
| 124 |
+
# Iniciar con el nodo ra铆z
|
| 125 |
+
raiz = datos_entrada["nombre"]
|
| 126 |
+
raiz_imagen = datos_entrada.get("imagen", None)
|
| 127 |
+
G.add_node(raiz, type='central', image=raiz_imagen if raiz_imagen else None, color=categoria_colores[0])
|
| 128 |
+
|
| 129 |
+
ramas = datos_entrada.get("ramas", [])
|
| 130 |
+
for rama in ramas:
|
| 131 |
+
agregar_nodos_recursivamente(G, raiz, rama, categoria_colores[0], edge_width_dict)
|
| 132 |
+
|
| 133 |
+
# Crear visualizaci贸n con pyvis
|
| 134 |
+
person_net = Network(
|
| 135 |
+
height='600px',
|
| 136 |
+
width='100%',
|
| 137 |
+
bgcolor='#222222',
|
| 138 |
+
font_color='white',
|
| 139 |
+
notebook=False
|
| 140 |
+
)
|
| 141 |
+
|
| 142 |
+
# Configurar los nodos con im谩genes, colores y tama帽os
|
| 143 |
+
for node, data in G.nodes(data=True):
|
| 144 |
+
node_categoria = data.get('type', 'central')
|
| 145 |
+
color = data.get('color', 'gray') # Color por defecto si no se encuentra la categor铆a
|
| 146 |
+
|
| 147 |
+
node_options = {
|
| 148 |
+
"label": node,
|
| 149 |
+
"shape": "circularImage" if data.get('image') else "circle",
|
| 150 |
+
"image": data.get('image', ''),
|
| 151 |
+
"color": color,
|
| 152 |
+
"size": 80 if node_categoria == 'central' else 20, # Tama帽o m谩s grande para el nodo central
|
| 153 |
+
"fixed": {"x": False, "y": False} # No fijar posici贸n
|
| 154 |
+
}
|
| 155 |
+
person_net.add_node(node, **node_options)
|
| 156 |
+
|
| 157 |
+
# Agregar edges con color y grosor
|
| 158 |
+
for source, target, edge_data in G.edges(data=True):
|
| 159 |
+
person_net.add_edge(source, target, color=edge_data.get('color', 'gray'), width=edge_data.get('width', 1))
|
| 160 |
+
|
| 161 |
+
# Configurar layout del grafo con centrado
|
| 162 |
+
person_net.repulsion(
|
| 163 |
+
node_distance=200,
|
| 164 |
+
central_gravity=0.33,
|
| 165 |
+
spring_length=100,
|
| 166 |
+
spring_strength=0.10,
|
| 167 |
+
damping=0.95
|
| 168 |
+
)
|
| 169 |
+
|
| 170 |
+
# Agregar opciones para mantener el gr谩fico centrado
|
| 171 |
+
person_net.set_options("""
|
| 172 |
+
var options = {
|
| 173 |
+
"physics": {
|
| 174 |
+
"stabilization": {
|
| 175 |
+
"enabled": true,
|
| 176 |
+
"iterations": 1000
|
| 177 |
+
},
|
| 178 |
+
"minVelocity": 0.75
|
| 179 |
+
},
|
| 180 |
+
"interaction": {
|
| 181 |
+
"dragNodes": true,
|
| 182 |
+
"zoomView": true
|
| 183 |
+
}
|
| 184 |
+
}
|
| 185 |
+
""")
|
| 186 |
+
|
| 187 |
+
# Guardar y mostrar grafo en HTML
|
| 188 |
+
path = '/tmp'
|
| 189 |
+
person_net.save_graph(f'{path}/pyvis_graph.html')
|
| 190 |
+
|
| 191 |
+
with open(f'{path}/pyvis_graph.html', 'r', encoding='utf-8') as HtmlFile:
|
| 192 |
+
graph_html = HtmlFile.read()
|
| 193 |
+
|
| 194 |
+
# Mostrar grafo en la app con Streamlit Components con ancho responsivo
|
| 195 |
+
components.html(graph_html, height=600, width=800)
|
| 196 |
+
|
| 197 |
+
# Pesta帽a principal
|
| 198 |
+
def main():
|
| 199 |
+
st.set_page_config(layout="wide")
|
| 200 |
+
# Display the image above the title
|
| 201 |
+
st.image('Mind Mapp.jpg', use_column_width=True)
|
| 202 |
+
st.title("Generador de Mapas Mentales")
|
| 203 |
+
# Agregar pesta帽as
|
| 204 |
+
tabs = st.tabs(["Rese帽a del Libro", "Mapa Mental", "Acerca de m铆"])
|
| 205 |
+
|
| 206 |
+
# Pesta帽a: Rese帽a del libro
|
| 207 |
+
with tabs[0]:
|
| 208 |
+
resumen = """
|
| 209 |
+
## Resumen del libro: "Mapas Mentales" de Tony Buzan
|
| 210 |
+
|
| 211 |
+
"Mapas Mentales" de Tony Buzan es una gu铆a completa sobre la creaci贸n y uso de mapas mentales como herramienta para el pensamiento creativo, la organizaci贸n de ideas y la mejora de la memoria. Tony Buzan, reconocido como el padre de los mapas mentales, introduce en este libro t茅cnicas probadas para maximizar la eficiencia mental y potenciar el aprendizaje.
|
| 212 |
+
|
| 213 |
+
### **Conceptos Clave del Libro**
|
| 214 |
+
|
| 215 |
+
1. **Estructura de los Mapas Mentales:**
|
| 216 |
+
- **Idea Central:** Comienza con una idea o concepto principal en el centro de la p谩gina.
|
| 217 |
+
- **Ramas Principales:** Se extienden desde la idea central, representando las ideas principales relacionadas.
|
| 218 |
+
- **Palabras Clave:** Cada rama est谩 etiquetada con palabras clave que representan conceptos importantes.
|
| 219 |
+
- **Im谩genes y Colores:** El uso de im谩genes y colores ayuda a estimular el cerebro y facilita la memorizaci贸n y comprensi贸n.
|
| 220 |
+
|
| 221 |
+
2. **Beneficios de los Mapas Mentales:**
|
| 222 |
+
- **Mejora la Memoria:** La estructura visual facilita la retenci贸n de informaci贸n.
|
| 223 |
+
- **Fomenta la Creatividad:** Permite explorar m煤ltiples conexiones y asociaciones de ideas.
|
| 224 |
+
- **Organizaci贸n Eficiente:** Ayuda a estructurar pensamientos de manera l贸gica y coherente.
|
| 225 |
+
- **Resoluci贸n de Problemas:** Facilita la identificaci贸n de soluciones mediante el an谩lisis visual de situaciones complejas.
|
| 226 |
+
|
| 227 |
+
3. **Aplicaciones Pr谩cticas:**
|
| 228 |
+
- **Educaci贸n:** Para tomar apuntes, planificar estudios y resumir informaci贸n.
|
| 229 |
+
- **Negocios:** En la planificaci贸n de proyectos, brainstorming y presentaciones.
|
| 230 |
+
- **Desarrollo Personal:** En la definici贸n de metas, planificaci贸n de carrera y organizaci贸n de ideas personales.
|
| 231 |
+
|
| 232 |
+
4. **T茅cnicas Avanzadas:**
|
| 233 |
+
- **Asociaciones Liberadas:** Estimula la generaci贸n de ideas sin restricciones.
|
| 234 |
+
- **Uso de S铆mbolos y Dibujo:** Potencia la creatividad y hace que los mapas sean m谩s atractivos visualmente.
|
| 235 |
+
- **Integraci贸n de Informaci贸n:** Combina diferentes fuentes de informaci贸n en un solo mapa mental para una visi贸n hol铆stica.
|
| 236 |
+
|
| 237 |
+
### **M茅todos de Creaci贸n de Mapas Mentales**
|
| 238 |
+
|
| 239 |
+
- **Inicio Central:** Colocar la idea principal en el centro y dibujar ramas radiales hacia las ideas secundarias.
|
| 240 |
+
- **Palabras Clave:** Utilizar palabras breves que capturen la esencia de cada idea.
|
| 241 |
+
- **Colores y S铆mbolos:** Aplicar diferentes colores para categorizar informaci贸n y s铆mbolos para representar conceptos.
|
| 242 |
+
- **Jerarqu铆a Visual:** Utilizar tama帽os de fuente y grosor de l铆neas para indicar la importancia relativa de las ideas.
|
| 243 |
+
|
| 244 |
+
### **Conclusi贸n**
|
| 245 |
+
|
| 246 |
+
"Mapas Mentales" de Tony Buzan es una herramienta poderosa para cualquier persona que busque mejorar su capacidad de pensar, organizar ideas y aprender de manera m谩s efectiva. El libro no solo explica la teor铆a detr谩s de los mapas mentales, sino que tambi茅n proporciona instrucciones pr谩cticas para su implementaci贸n en diversas 谩reas de la vida personal y profesional.
|
| 247 |
+
"""
|
| 248 |
+
st.markdown(resumen)
|
| 249 |
+
|
| 250 |
+
# Pesta帽a: Mapa Mental
|
| 251 |
+
with tabs[1]:
|
| 252 |
+
st.header("Mapa Mental")
|
| 253 |
+
st.sidebar.subheader("Ingresar Datos del Mapa Mental:")
|
| 254 |
+
|
| 255 |
+
# Formulario para la idea principal
|
| 256 |
+
st.sidebar.markdown("## Idea Principal")
|
| 257 |
+
nombre_principal = st.sidebar.text_input(
|
| 258 |
+
"Ingrese el nombre de la idea principal:",
|
| 259 |
+
st.session_state['mapa_mental']['nombre'],
|
| 260 |
+
key="nombre_principal"
|
| 261 |
+
)
|
| 262 |
+
|
| 263 |
+
imagen_principal = st.sidebar.file_uploader(
|
| 264 |
+
"Cargue una imagen para la idea principal",
|
| 265 |
+
type=["png", "jpg", "jpeg"],
|
| 266 |
+
key="imagen_principal"
|
| 267 |
+
)
|
| 268 |
+
if imagen_principal:
|
| 269 |
+
imagen_base64 = get_image_base64(imagen_principal.read())
|
| 270 |
+
st.session_state['mapa_mental']['imagen'] = imagen_base64
|
| 271 |
+
elif not st.session_state['mapa_mental']['imagen']:
|
| 272 |
+
st.session_state['mapa_mental']['imagen'] = ''
|
| 273 |
+
|
| 274 |
+
st.session_state['mapa_mental']['nombre'] = nombre_principal
|
| 275 |
+
|
| 276 |
+
st.sidebar.markdown("---")
|
| 277 |
+
|
| 278 |
+
# Bot贸n para agregar rama a la idea principal
|
| 279 |
+
if st.sidebar.button("Agregar rama a la idea principal"):
|
| 280 |
+
agregar_rama(st.session_state['mapa_mental'])
|
| 281 |
+
|
| 282 |
+
# Renderizar las ramas de la idea principal
|
| 283 |
+
if st.session_state['mapa_mental']['nombre']:
|
| 284 |
+
renderizar_ramas(st.session_state['mapa_mental'], "Idea Principal")
|
| 285 |
+
|
| 286 |
+
st.sidebar.markdown("---")
|
| 287 |
+
|
| 288 |
+
# Bot贸n para resetear el mapa mental
|
| 289 |
+
if st.sidebar.button("Resetear Mapa Mental"):
|
| 290 |
+
st.session_state['mapa_mental'] = {
|
| 291 |
+
'nombre': '',
|
| 292 |
+
'imagen': '',
|
| 293 |
+
'ramas': []
|
| 294 |
+
}
|
| 295 |
+
st.experimental_rerun()
|
| 296 |
+
|
| 297 |
+
# Bot贸n para generar el grafo
|
| 298 |
+
if st.sidebar.button("Generar Mapa Mental"):
|
| 299 |
+
crear_grafico_mind_map(st.session_state['mapa_mental'])
|
| 300 |
+
|
| 301 |
+
# Pesta帽a: Acerca de m铆
|
| 302 |
+
with tabs[2]:
|
| 303 |
+
st.header("Acerca de m铆")
|
| 304 |
+
acerca_de_mi = """
|
| 305 |
+
隆Hola! Soy Migue, desarrollo herramientas para facilitar la visualizaci贸n y organizaci贸n de ideas mediante mapas mentales interactivos. Esta aplicaci贸n est谩 dise帽ada para ayudarte a estructurar tus pensamientos de manera eficiente y creativa, utilizando tecnolog铆as como Streamlit, Pyvis y NetworkX.
|
| 306 |
+
|
| 307 |
+
**Caracter铆sticas de la Aplicaci贸n:**
|
| 308 |
+
- **Interfaz Intuitiva:** Agrega ideas principales y sus ramas de forma sencilla.
|
| 309 |
+
- **Visualizaci贸n Interactiva:** Explora tus mapas mentales de manera din谩mica y visualmente atractiva.
|
| 310 |
+
- **Personalizaci贸n:** Asigna im谩genes y colores a tus nodos para una mejor organizaci贸n y est茅tica.
|
| 311 |
+
|
| 312 |
+
**Contacto:**
|
| 313 |
+
- **Correo Electr贸nico:** [mail](mailto:josemiguelaguilart.com)
|
| 314 |
+
- **LinkedIn:** [LinkedIn](https://www.linkedin.com/in/josemaguilar/)
|
| 315 |
+
|
| 316 |
+
"""
|
| 317 |
+
st.markdown(acerca_de_mi)
|
| 318 |
+
|
| 319 |
+
if __name__ == "__main__":
|
| 320 |
+
main()
|
requirements.txt
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
streamlit
|
| 2 |
+
matplotlib
|
| 3 |
+
pandas
|
| 4 |
+
plotly
|
| 5 |
+
networkx
|
| 6 |
+
pyvis
|
| 7 |
+
Pillow
|