Closed leonardofl closed 11 years ago
Léo, talvez tenhamos que definir um tamanho máximo e um tamanho mínimo previamente e interpolar entre estes extremos. Desse ponto de vista, na hora de plotar o gráfico também seria interessante fazer com que a "margem interna" da área do gráfico seja igual ao maior raio. Dessa forma os círculos sempre estarão completamente visíveis.
Legal, gostei da sugestão.
Eu sou da opinião de que a área da circunferência deve a todo custo ser (diretamente) proporcional à variável que ela representa; no caso, ao tamanho do partido. Fazer diferente disso seria para mim como manipular o gráfico. Nós queremos em primeiro lugar que o gráfico reflita os dados e, em segundo lugar, se possível, que fique visualmente agradável. Não o contrário.
Nesse espírito, supondo que o algoritmo está fazendo raios proporcionais à raiz do tamanho do partido (não conferi, mas é o que fazia na cmsp e em todos os gráficos anteriores que fizemos da câmara dos deputados), considero que a solução é reduzir o tamanho das circunferências de todos os partidos, inclusive dos partidos menores. Eu não acho que elas estão no tamanho mínimo aceitável, e considero aceitável se o número do partido não couber no interior do círculo. Como já existe o número para chamar atenção para a posição do partido, o tamanho mínimo aceitável seria para mim um ponto de um ou dois pixels mesmo, se necessário, e acho que nem será necessário fazer tão pequeno.
Resumindo, basta multiplicar todos os raios por um fator de escala F, que neste caso seria menor que 1.
Agora uma sugestão de algoritmo para definir F: Fixemos uma área total desejada, igual à soma das áreas de todos os círculos a serem apresentadas (com fator F já aplicado). A menos de uma constante pi, esta área é igual à soma dos quadrados dos raios dos círculos. Então determina-se F pela fórmula:
F = Área total desejada / soma(raios originais dos círculos, ao quadrado)
E os novos raios serão:
Raio novo = F * Raio antigo
Para evitar problemas com bordas, verifica-se neste momento se algum raio novo está grande demais, e se estiver usa-se um fator F menor, tal que o maior raio não seja maior que Rmáx, igual ao tamanho das bordas.
Pode-se fazer alguns testes alterando a constante "Área total desejada" até obter um gráfico bonito, e uma vez determinada esta constante provavelmente qualquer outro gráfico também vai ficar bom com a mesma constante.
OBS: Aproveitando o assunto, é imprescindível fazer a área de plotagem QUADRADA, pois os eixos devem ser equivalentes, e plotar em uma área retangular da forma como está sendo feito distorce as distâncias, e se for plotado de uma forma que não as distorça mesmo assim haverá um efeito visual indesejável de diferenciação entre os eixos.
Por hora, para que possamos mostrar o gráfico das duas casas, deixei todas as circunferências do mesmo tamanho. 3bb4c4416d2fa4378a978657b45cceeb53bcdd7d
Resolvi parcialmente, adotando a solução que descrevi antes. Aqui vão alguns detalhes:
mas os tamanhos dos partidos para a cmsp estão vindo todos iguais a zero (devido a algum bug não identificado!)
eu que fiz isso, pra retirar a funcionalidade de tamanho de partido no gráfico pra gente poder por em produção a página da câmara dos deputados. A classe q gera o json atribui zero ao tamanho do partido (esa foi minha alteração).
A julgar pela versão em produção parece q estamos OK em relação isso. Se alguém achar q não, só gritar e reabrir o issue.
O algoritmo para definir o tamanho das esferas no gráfico PCA está ajustado pra mostrar uma boa representação da Câmara Municipal de São Paulo.
Mas o mesmo algoritmos não ficou muito bom na Câmara dos Deputados, como podemos ver na figura: https://dl.dropbox.com/u/18183156/radar/pca_cdep.png
Repare que os partidos pequenos estão de fato com um tamanho que parece ser o mínimo aceitável. Logo, no fundo o problema que temos aqui é o da enorme disparidade entre o tamanho das bancadas dos partidos. Talvez seja necessário um algoritmo não linear para determinar o tamanho das circunferências. Acredito que algo como "faixas de tamanhos" devam ser usadas.
De qualquer forma, o mais importante é obter um algoritmo mais geral que se adeque bem em qualquer situação.