Spaces:
Sleeping
Sleeping
import plotly.graph_objects as go | |
import numpy as np | |
THEME_COLORS = { | |
'dark': { | |
'background': 'rgba(28, 28, 28, 0.95)', | |
'primary': '#9C27B0', | |
'accent': '#FF4081', | |
'text': '#FFFFFF', | |
'grid': 'rgba(156, 39, 176, 0.2)', | |
'line': 'rgba(156, 39, 176, 0.5)' | |
}, | |
'light': { | |
'background': 'rgba(255, 255, 255, 0.95)', | |
'primary': '#7B1FA2', | |
'accent': '#E91E63', | |
'text': '#333333', | |
'grid': 'rgba(123, 31, 162, 0.2)', | |
'line': 'rgba(123, 31, 162, 0.5)' | |
} | |
} | |
# Dicionário de tradução para os nomes dos planetas | |
PLANET_NAMES = { | |
'Sun': 'Sol', | |
'Moon': 'Lua', | |
'Mercury': 'Mercúrio', | |
'Venus': 'Vênus', | |
'Mars': 'Marte', | |
'Jupiter': 'Júpiter', | |
'Saturn': 'Saturno', | |
'Uranus': 'Urano', | |
'Neptune': 'Netuno', | |
'Pluto': 'Plutão' | |
} | |
# Dicionário de símbolos dos signos | |
ZODIAC_SYMBOLS = { | |
"Áries": "♈", | |
"Touro": "♉", | |
"Gêmeos": "♊", | |
"Câncer": "♋", | |
"Leão": "♌", | |
"Virgem": "♍", | |
"Libra": "♎", | |
"Escorpião": "♏", | |
"Sagitário": "♐", | |
"Capricórnio": "♑", | |
"Aquário": "♒", | |
"Peixes": "♓" | |
} | |
def calcular_signo(graus): | |
"""Converte uma posição em graus para o signo correspondente.""" | |
signos = ["Áries", "Touro", "Gêmeos", "Câncer", "Leão", "Virgem", | |
"Libra", "Escorpião", "Sagitário", "Capricórnio", "Aquário", "Peixes"] | |
grau_normalizado = graus % 360 | |
indice = int(grau_normalizado // 30) | |
return signos[indice] | |
def create_wheel_chart(planet_positions, houses, theme='dark'): | |
"""Gera um gráfico interativo do mapa astral usando Plotly.""" | |
colors = THEME_COLORS[theme] | |
# Criar o círculo base | |
theta = np.linspace(0, 2*np.pi, 360) | |
r = np.ones_like(theta) | |
# Criar a figura | |
fig = go.Figure() | |
# Adicionar o círculo principal | |
fig.add_trace(go.Scatterpolar( | |
r=r, | |
theta=np.degrees(theta), | |
mode='lines', | |
line=dict(color=colors['primary'], width=2), | |
showlegend=False, | |
fill='toself', | |
fillcolor=colors['background'] | |
)) | |
# Adicionar linhas das casas | |
for house in houses['cusps']: | |
angle = house | |
fig.add_trace(go.Scatterpolar( | |
r=[0, 1], | |
theta=[angle, angle], | |
mode='lines', | |
line=dict(color=colors['line'], width=1), | |
showlegend=False | |
)) | |
# Adicionar o signo solar com destaque | |
sun_longitude = planet_positions['Sun']['longitude'] | |
sun_sign = calcular_signo(sun_longitude) | |
fig.add_trace(go.Scatterpolar( | |
r=[0.9], | |
theta=[sun_longitude], | |
mode='text', | |
text=[f"{sun_sign} {ZODIAC_SYMBOLS[sun_sign]}"], | |
textposition="middle center", | |
textfont=dict( | |
color=colors['text'], | |
size=24, | |
family="Arial" | |
), | |
showlegend=False | |
)) | |
# Adicionar planetas | |
for planet, data in planet_positions.items(): | |
if planet != 'Sun': #Avoid duplicating Sun | |
planet_name = PLANET_NAMES.get(planet, planet) # Usar nome traduzido | |
fig.add_trace(go.Scatterpolar( | |
r=[0.8], | |
theta=[data['longitude']], | |
mode='markers+text', | |
name=planet_name, | |
text=[planet_name], | |
textposition="top center", | |
textfont=dict( | |
color=colors['text'], | |
size=16, # Aumentado o tamanho da fonte | |
family="Arial" # Fonte mais legível | |
), | |
marker=dict( | |
size=18, # Aumentado o tamanho do marcador | |
color=colors['accent'], | |
symbol='star', | |
line=dict( | |
color=colors['text'], | |
width=1 | |
) | |
), | |
showlegend=True | |
)) | |
# Atualizar layout | |
fig.update_layout( | |
polar=dict( | |
radialaxis=dict( | |
visible=False, | |
range=[0, 1] | |
), | |
angularaxis=dict( | |
direction="clockwise", | |
period=360, | |
rotation=90, | |
tickmode='array', | |
ticktext=['♈', '♉', '♊', '♋', '♌', '♍', '♎', '♏', '♐', '♑', '♒', '♓'], | |
tickvals=np.arange(0, 360, 30), | |
tickfont=dict( | |
size=24, # Aumentado o tamanho dos símbolos zodiacais | |
color=colors['text'] | |
), | |
gridcolor=colors['grid'], | |
linecolor=colors['line'] | |
), | |
bgcolor=colors['background'] | |
), | |
paper_bgcolor='rgba(0,0,0,0)', | |
plot_bgcolor='rgba(0,0,0,0)', | |
showlegend=True, | |
legend=dict( | |
bgcolor=colors['background'], | |
bordercolor=colors['primary'], | |
borderwidth=1, | |
font=dict( | |
color=colors['text'], | |
size=14, | |
family="Arial" | |
), | |
itemsizing='constant', | |
yanchor="top", | |
y=0.99, | |
xanchor="left", | |
x=1.1, | |
title=dict( | |
text="Planetas", | |
font=dict( | |
size=16, | |
family="Arial", | |
color=colors['text'] | |
) | |
) | |
), | |
margin=dict(l=20, r=120, t=20, b=20), # Ajustado para acomodar a legenda | |
height=800 | |
) | |
return fig |