1) Czy jest jakaś biblioteka / funkcja R, która implementowałaby INTELIGENTNE umieszczanie etykiet na wykresie R? Wypróbowałem kilka, ale wszystkie są problematyczne - wiele etykiet nakłada się albo na siebie, albo na inne punkty (lub inne obiekty na wykresie, ale widzę, że jest to znacznie trudniejsze w obsłudze).
2) Jeśli nie, to czy jest jakikolwiek sposób, jak WYGODNIE pomóc algorytmowi w umieszczeniu etykiety dla poszczególnych problematycznych punktów? Pożądane najbardziej wygodne i wydajne rozwiązanie.
Możesz zagrać i przetestować inne możliwości na moim odtwarzalnym przykładzie i sprawdzić, czy jesteś w stanie osiągnąć lepsze wyniki niż ja:
# 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")
W przypadku etykietowania wypróbowałem następnie te możliwości, nikt nie jest naprawdę dobry:
1) ten jest okropny:
text(x, y, labels = ShortSci, cex= 0.7, offset = 10)
2) ten jest dobry, jeśli nie chcesz umieszczać etykiet dla wszystkich punktów, ale tylko dla wartości odstających, ale nadal etykiety są często umieszczane nieprawidłowo:
identify(x, y, labels = ShortSci, cex = 0.7)
3) ten wyglądał obiecująco, ale jest problem z etykietami, które są zbyt blisko punktów; Musiałem wypełnić je spacjami, ale to niewiele pomaga:
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)
Z góry dziękuję!
EDYCJA: todo: spróbuj labcurve {Hmisc} .
install.packages("FField")
library(FField)
FFieldPtRepDemo()
Odpowiedzi:
Po pierwsze, oto wyniki mojego rozwiązania tego problemu:
Zrobiłem to ręcznie w podglądzie (bardzo podstawowa przeglądarka plików PDF / obrazów w systemie OS X) w ciągu zaledwie kilku minut. ( Edycja: Przepływ pracy był dokładnie taki, jakiego można się spodziewać: zapisałem wykres jako plik PDF z R, otworzyłem go w podglądzie i utworzyłem pola tekstowe z żądanymi etykietami (9 pkt Helvetica), a następnie po prostu przeciągałem je myszą, aż wyglądały dobrze. Następnie wyeksportowałem do PNG w celu przesłania do SO.)
Teraz, zanim ulegniesz silnej potrzebie odrzucenia, zagłosuj na to w zapomnienie i zostawisz złośliwe komentarze o tym, jak chodzi o zautomatyzowanie tego procesu, wysłuchaj mnie!
Szukanie rozwiązań algorytmicznych jest w porządku i (IMHO) naprawdę interesujące. Jednak według mnie sytuacje związane z oznaczaniem punktów można podzielić z grubsza na trzy kategorie:
text
), nie jest to dużo wysiłku.: wchodzenie na mydelniczkę:
Ponieważ ludzie tacy jak my uwielbiają automatyzację, myślę, że często wpadamy w pułapkę myślenia, że prawie każdy aspekt tworzenia dobrej grafiki statystycznej powinien być zautomatyzowany. Z całym szacunkiem (pokorą!) Się nie zgadzam.
Nie ma doskonale ogólnego środowiska do tworzenia statystyk, które automagicznie tworzy obraz, który masz w głowie. Rzeczy takie jak R, ggplot2, lattice itp. Wykonują większość pracy; ale ta dodatkowa drobna zmiana, dodanie linii tutaj, dostosowanie tam marginesu, prawdopodobnie lepiej pasuje do innego narzędzia.
: zejście z mydelniczki:
Chciałbym również zauważyć, że myślę, że wszyscy moglibyśmy wymyślić wykresy rozrzutu z mniej niż 10-15 punktami, które będą prawie niemożliwe do wyczyszczenia, nawet ręcznie, i prawdopodobnie zepsują każde automatyczne rozwiązanie, które ktoś wymyśli.
Na koniec chcę powtórzyć, że wiem, że to nie jest odpowiedź, której szukasz. I nie mówię, że próby algorytmiczne są bezużyteczne lub głupie. Głosowałem za tym pytaniem i z radością zagłosuję za ciekawymi rozwiązaniami algorytmicznymi!
Powodem, dla którego opublikowałem tę odpowiedź, jest to, że myślę, że to pytanie powinno być kanonicznym pytaniem o oznaczenie punktu w R dla przyszłych duplikatów i myślę, że rozwiązania obejmujące ręczne etykietowanie zasługują na miejsce przy stole, to wszystko.
źródło
ggrepel
wygląda obiecująco po zastosowaniu doggplot2
wykresów rozrzutu.źródło
Czy wypróbowałeś pakiet directlabels ?
A tak przy okazji, argumenty pos i offset mogą przyjmować wektory, aby umożliwić umieszczenie ich we właściwych pozycjach, gdy istnieje rozsądna liczba punktów w zaledwie kilku przebiegach wykresu.
źródło
plot()
drukowaniem? Nie udało mi się spróbować, więc ... Dzięki! PS: @SpacedMan & Ben, wyczyściłem swoje komentarze dotyczące aktualizacji R, ponieważ nie są one aż tak interesujące - możesz zrobić to samo.Znalazłem rozwiązanie! Niestety nie jest to ostateczne i idealne rozwiązanie, ale teraz działa najlepiej dla mnie. Jest w połowie algorytmiczny, w połowie ręczny, więc oszczędza czas w porównaniu do czysto ręcznego rozwiązania naszkicowanego przez jorana.
Przeoczyłem bardzo ważną część
?identify
pomocy!Jeśli więc korzystasz z
identify()
rozwiązania, które napisałem w moim pytaniu, możesz wpłynąć na pozycję etykiety, nie klikając bezpośrednio w tym punkcie, ale klikając obok tego punktu w odpowiednim kierunku !!! Działa po prostu świetnie!Wadą jest to, że są tylko 4 pozycje (górna, lewa, dolna, prawa), ale bardziej doceniłbym pozostałe 4 (lewy górny, prawy górny, lewy dolny, prawy dolny) ... użyj tego do oznaczenia punktów, w których mi to nie przeszkadza, i pozostałych punktów, które oznaczam bezpośrednio w mojej prezentacji Powerpoint, zgodnie z propozycją jorana :-)
PS: Nie wypróbowałem jeszcze rozwiązania directlabels lattice / ggplot, nadal wolę korzystać z podstawowej biblioteki wykresów.
źródło
Proponuję przyjrzeć się
wordcloud
paczce. Wiem, że ten pakiet koncentruje się nie dokładnie na punktach, ale na samych etykietach, a także wydaje się, że styl jest raczej ustalony. Mimo to wyniki, które uzyskałem, były oszałamiające. Należy również zauważyć, że wersja pakietu, o której mowa, została wydana mniej więcej w czasie, gdy zadałeś pytanie, więc nadal jest bardzo nowa.http://blog.fellstat.com/?cat=11
źródło
Napisałem funkcję języka R wywołaną
addTextLabels()
w pakieciebasicPlotteR
. Pakiet można zainstalować bezpośrednio w bibliotece języka R przy użyciu następującego kodu:W podanym przykładzie użyłem następującego kodu, aby wygenerować przykładową figurę, do której link znajduje się poniżej.
Działa poprzez automatyczne wybieranie alternatywnej lokalizacji z drobnej siatki punktów. Najbliższe punkty siatki są odwiedzane jako pierwsze i wybierane, jeśli nie pokrywają się z żadnymi wykreślonymi punktami lub etykietami. Jeśli jesteś zainteresowany, spójrz na kod źródłowy .
źródło
Brak odpowiedzi, ale zbyt długi czas na komentarz. Bardzo prostym podejściem, które może działać na prostych przypadkach, gdzieś pomiędzy post-processingiem jorana a bardziej wyrafinowanymi algorytmami, które zostały zaprezentowane, jest stworzenie
in-place
jorana prostych transformacji w ramce danych.Ilustruję to,
ggplot2
ponieważ jestem bardziej zaznajomiony z tą składnią niż bazowe wykresy R.Jak widać, w tym przypadku wynik nie jest idealny, ale do niektórych celów może być wystarczający. I jest to dość łatwe, zazwyczaj wystarczy coś takiego
within(df, y <- y+.01)
źródło
df
użytkowaniawithin
, często robię to dostosowując estetykę:geom_text(aes(x = x - .01, y = y + .01), hjust = 0, vjust = 0)
wydaje się czystszy.