znalazłem piękny przykład kreślenia wypukłe kształty kadłuba za pomocą ggplot z ddply tutaj: Drawing outlines around multiple geom_point groups with ggplotConvex ggplot kadłuba za pomocą data.tables w R
pomyślałem, że spróbować czegoś podobnego - stworzyć coś jak Ashby diagramie --to praktyka z pakietem data.table:
test<-function()
{
library(data.table)
library(ggplot2)
set.seed(1)
Tu zdefiniować prostą tabelę:
dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level")
I wtedy zdefiniować pozycje kadłuba poziomie:
hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")
Więc moja myśl była scalić kadłuby z dt, tak, że mogę w końcu manipulować kadłubów, aby w odpowiedniej formie do ggplot (pokazany poniżej dla porównania):
ashby<-ggplot(dt,aes(x=xdata,y=ydata,color=level))+
geom_point()+
geom_line()+
geom_polygon(data=hulls,aes(fill=level))
}
Ale wydaje się, że jakkolwiek próbuję połączyć kadłuby i dt, pojawia się błąd. Na przykład scalenie (kadłuby, dt) powoduje błąd, jak pokazano w przypisie 1.
Wygląda na to, że powinienem być prosty i jestem pewien, że po prostu brakuje mi czegoś oczywistego. Jakikolwiek kierunek do podobnego postu lub myśli na temat przygotowania kadłuba do ggplot jest bardzo doceniany. Lub jeśli uważasz, że najlepiej jest trzymać się podejścia ddply, proszę dać mi znać.
Przykład niepożądany Wydajność:
test<-function(){
library(data.table)
library(ggplot2)
dt<-data.table(xdata=runif(15),ydata=runif(15),level=rep(c("a","b","c"),each=5),key="level")
set.seed(1)
hulls<-dt[,as.integer(chull(.SD)),by=level]
setnames(hulls,"V1","hcol")
setkey(dt, 'level') #setting the key seems unneeded
setkey(hulls, 'level')
hulls<-hulls[dt, allow.cartesian = TRUE]
ggplot(dt,aes(x=xdata,y=ydata,color=level))+
geom_point()+
geom_polygon(data=hulls,aes(fill=level))
}
powoduje MES wielokątów przecinających:
Przypis 1: Błąd vecseq (f__, len__ jeśli (umożliwić .cartesian) NULL else as.integer (max (nrow (x),: Połączyć wyniki w 60 wierszach, więcej niż 15 = max (Nrow (x), Nrow (i)). Sprawdź, czy nie występują podwójne wartości klucza w i, z których dołącz do tego samego grupuj w x wielokrotnie. Jeśli wszystko jest w porządku, spróbuj wpisać j
i upuszczając by
(by-without-by), aby j przebiegła dla każdej grupy, aby uniknąć dużej alokacji. Jeśli jesteś pewien, że chcesz kontynuować, uruchom ponownie za pomocą allow.cartesian = TRUE. W przeciwnym razie wyszukaj ten komunikat o błędzie w FAQ, Wiki, Stack Overflow i datatable-help, aby uzyskać poradę.
Zgaduję, że istnieje elegancki sposób robienia tego. Mając taką zdolność, myślę, że metoda ta mogłaby być łatwo rozszerzona, aby tworzyć fabułę w stylu Ashby. Na przykład: http://commons.wikimedia.org/wiki/File:Ashby_plot_big.jpg – Docuemada
+1 za pokazanie swoich wysiłków i jasne wyjaśnienie, czego chcesz. Pamiętaj, że wywołanie 'library' w twojej własnej funkcji jest prawdopodobnie niepotrzebne (i nieefektywne, jeśli zamierzasz wielokrotnie wywoływać tę funkcję). –