1) Existe alguma biblioteca / função R que implementaria a colocação INTELIGENTE de rótulo no gráfico R? Tentei alguns, mas todos são problemáticos - muitos rótulos estão se sobrepondo uns aos outros ou a outros pontos (ou outros objetos no gráfico, mas vejo que isso é muito mais difícil de manusear).
2) Se não, há alguma maneira de ajudar CONFORTÁVELMENTE o algoritmo com a colocação de rótulos para pontos problemáticos particulares? A solução mais confortável e eficiente desejada.
Você pode jogar e testar outras possibilidades com meu exemplo reproduzível e ver se consegue obter resultados melhores do que eu:
# data
x = c(0.8846, 1.1554, 0.9317, 0.9703, 0.9053, 0.9454, 1.0146, 0.9012,
0.9055, 1.3307)
y = c(0.9828, 1.0329, 0.931, 1.3794, 0.9273, 0.9605, 1.0259, 0.9542,
0.9717, 0.9357)
ShortSci = c("MotAlb", "PruMod", "EriRub", "LusMeg", "PhoOch", "PhoPho",
"SaxRub", "TurMer", "TurPil", "TurPhi")
# basic plot
plot(x, y, asp=1)
abline(h = 1, col = "green")
abline(v = 1, col = "green")
Para rotular, tentei essas possibilidades, ninguém é realmente bom:
1) este é terrível:
text(x, y, labels = ShortSci, cex= 0.7, offset = 10)
2) este é bom se você não quiser colocar rótulos para todos os pontos, mas apenas para os outliers, mas ainda assim, os rótulos costumam ser colocados errados:
identify(x, y, labels = ShortSci, cex = 0.7)
3) este parecia promissor, mas existe o problema dos rótulos estarem muito próximos dos pontos; Tive que preenchê-los com espaços, mas isso não ajuda muito:
require(maptools)
pointLabel(x, y, labels = paste(" ", ShortSci, " ", sep=""), cex=0.7)
4)
require(plotrix)
thigmophobe.labels(x, y, labels = ShortSci, cex=0.7, offset=0.5)
5)
require(calibrate)
textxy(x, y, labs=ShortSci, cx=0.7)
Agradeço antecipadamente!
EDIT: todo: tente labcurve {Hmisc} .
install.packages("FField")
library(FField)
FFieldPtRepDemo()
Respostas:
Primeiro, aqui estão os resultados da minha solução para este problema:
Fiz isso manualmente no Preview (PDF / visualizador de imagens muito básico no OS X) em apenas alguns minutos. ( Editar: o fluxo de trabalho foi exatamente o que você esperava: salvei o gráfico como um PDF do R, abri na visualização e criei caixas de texto com os rótulos desejados (9pt Helvetica) e, em seguida, apenas arrastei-os com meu mouse até que parecessem bom. Em seguida, exportei para um PNG para enviar para o SO.)
Agora, antes de você sucumbir ao forte desejo de votar isso no esquecimento e deixar comentários sarcásticos sobre como o objetivo é automatizar esse processo, ouça-me!
Procurar soluções algorítmicas é totalmente aceitável e (IMHO) realmente interessante. Mas, para mim, as situações de rotulagem apontam para cerca de três categorias:
text
) não é que muito esforço.: subindo na caixa de sabão:
Já que gente como nós ama a automação, acho que muitas vezes caímos na armadilha de pensar que quase todos os aspectos da produção de um bom gráfico estatístico devem ser automatizados. Eu respeitosamente (humildemente!) Discordo.
Não existe um ambiente de plotagem estatístico perfeitamente geral que crie automaticamente a imagem que você tem em sua cabeça. Coisas como R, ggplot2, lattice etc. fazem a maior parte do trabalho; mas aquele pequeno ajuste extra, adicionar uma linha aqui, ajustar uma margem ali, provavelmente é mais adequado para uma ferramenta diferente.
: descendo da caixa de sabão:
Eu também observaria que acho que todos nós poderíamos chegar a gráficos de dispersão com <10-15 pontos que seriam quase impossíveis de rotular de forma limpa, mesmo à mão, e isso provavelmente quebrará qualquer solução automática que alguém venha com.
Por fim, quero reiterar que sei que essa não é a resposta que você está procurando. E eu estou não dizer que as tentativas de algoritmos são inúteis ou mudo. Votei nesta questão e ficarei feliz em votar em soluções algorítmicas interessantes!
A razão pela qual postei esta resposta é que acho que essa pergunta deveria ser a pergunta canônica de "marcação pontual em R" para futuras duplicatas, e acho que as soluções que envolvem marcação manual merecem um lugar à mesa, só isso.
fonte
ggrepel
parece promissor quando aplicado aggplot2
gráficos de dispersão.fonte
Você já experimentou o pacote directlabels ?
E, BTW, os argumentos pos e offset podem usar vetores para permitir que você os coloque nas posições corretas quando houver um número razoável de pontos em apenas algumas execuções do gráfico.
fonte
plot()
plot normal ? Não tive sucesso tentando então ... Obrigado! PS: @SpacedMan & Ben, limpei meus comentários sobre a atualização do R, uma vez que eles não são muito interessantes - você pode fazer o mesmo.Encontrei alguma solução! Não é definitivo e ideal, infelizmente, mas é o que funciona melhor para mim agora. É meio algoritmico, meio manual, então economiza tempo em comparação com a solução manual pura esboçada por joran.
Esqueci uma parte muito importante da
?identify
ajuda!Então, se você usar a
identify()
solução como eu escrevi na minha pergunta, você pode afetar a posição do rótulo não clicando diretamente naquele ponto, mas clicando próximo a esse ponto relativamente na direção desejada !!! Funciona muito bem!A desvantagem é que existem apenas 4 posições (superior, esquerda, inferior, direita), mas eu gostaria mais das outras 4 (superior esquerdo, superior direito, inferior esquerdo, inferior direito) ... Então, eu uso isso para rotular pontos onde não me incomoda e o resto dos pontos eu rotulo diretamente na minha apresentação em PowerPoint, conforme proposto por joran :-)
PS: Eu ainda não experimentei a solução directlabels lattice / ggplot, ainda prefiro usar a biblioteca de plotagem básica.
fonte
Eu sugiro que você dê uma olhada no
wordcloud
pacote. Eu sei que este pacote foca não exatamente nos pontos, mas nos rótulos em si, e também o estilo parece ser bastante fixo. Mesmo assim, os resultados que obtive ao usá-lo foram impressionantes. Observe também que a versão do pacote em questão foi lançada na época em que você fez a pergunta, portanto, ainda é muito nova.http://blog.fellstat.com/?cat=11
fonte
Eu escrevi uma função R chamada
addTextLabels()
dentro de um pacoteplotteR
. O pacote pode ser instalado diretamente em sua biblioteca R usando o seguinte código:Para o exemplo fornecido, usei o código a seguir para gerar a figura de exemplo com link abaixo.
Funciona selecionando automaticamente um local alternativo em uma grade fina de pontos. Os pontos mais próximos na grade são visitados primeiro e selecionados se não se sobrepõem a nenhum ponto ou rótulo traçado. Dê uma olhada no código- fonte , se você estiver interessado.
fonte
Não é uma resposta, mas muito tempo para um comentário. Uma abordagem muito simples que pode funcionar em casos simples, em algum lugar entre o pós-processamento de
in-place
Joran e os algoritmos mais sofisticados que foram apresentados, é fazer transformações simples no dataframe.Ilustro isso com
ggplot2
porque estou mais familiarizado com essa sintaxe do que gráficos R de base.Como você pode ver, neste caso o resultado não é ideal, mas pode ser bom o suficiente para alguns propósitos. E é muito fácil, normalmente algo assim é suficiente
within(df, y <- y+.01)
fonte
df
usowithin
, geralmente faço isso ajustando a estética:geom_text(aes(x = x - .01, y = y + .01), hjust = 0, vjust = 0)
parece mais limpo.