Migue1804 commited on
Commit
3ea2673
verified
1 Parent(s): 160c91f

Upload 3 files

Browse files
Files changed (3) hide show
  1. Mind Mapp.jpg +0 -0
  2. app.py +320 -0
  3. 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