2017-12-08 4 views
1

Ich versuche, mehrere Piecharts auf einem Bild zu plotten. Ich möchte custom_annotation verwenden, um das gerasterte Bild zu plotten. Aber im Moment kann ich nicht einmal die vielen Piecharts bekommen.mehrere Torten mit scatterpie oder ggforce

Schließlich möchte ich 6 Kuchen in verschiedenen Spots über einem Bild plotten. imX und imY geben Sie die Koordinaten an, wo die Pasteten auf dem Bild sein sollten.

head(wholebody_cutLH_wide_t[c(1,2,102,103,104)]) 
Acidobacteriaceae Actinomycetaceae imX imY radius 
1  0.000000e+00  7.665687e-05 2.00 5.5 0.5 
2  0.000000e+00  4.580237e-04 1.50 1.0 0.5 
3  0.000000e+00  4.112573e-04 1.75 2.0 0.5 
4  6.431473e-04  3.856008e-02 0.30 1.0 0.5 
5  0.000000e+00  3.013013e-04 1.50 4.8 0.5 
6  3.399756e-05  1.372986e-02 1.50 5.2 0.5 

Hier ist mein Versuch mit scatterpie:

ggplot(wholebody_cutLH_wide_t) + 
# annotation_custom(g, xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf) + 
geom_scatterpie(aes(x=imX, y=imY,r=radius), 
      data=wholebody_cutLH_wide_t, cols=NA,color=sample(allcolors,101)) + 
scale_color_manual(values=sample(allcolors,101)) + 
scale_x_continuous(expand=c(0,0), lim=c(0,3)) + 
scale_y_continuous(expand=c(0,0), lim=c(0,6)) + 
theme(legend.position="none", 
    panel.background = element_rect(fill = "transparent") # bg of the panel 
    , plot.background = element_rect(fill = "transparent") # bg of the plot 
    , panel.grid.major = element_blank() # get rid of major grid 
    , panel.grid.minor = element_blank(), # get rid of minor grid 
    line = element_blank(), 
    text = element_blank(), 
    title = element_blank() 
) 

Jetzt ist mein Fehler ist:

Error: Only strings can be converted to symbols 

Hier ist mein Versuch mit dplyr und ggforce:

dat_pies<-left_join(wholebody_cutLH, 
       wholebody_cutLH %>% 
        group_by(tax_rank) %>% 
        summarize(Cnt_total = sum(count_norm))) %>% 
group_by(tax_rank) %>% 
mutate(end_angle = 2*pi*cumsum(count_norm)/Cnt_total,  # ending angle for each pie slice 
    start_angle = lag(end_angle, default = 0), # starting angle for each pie slice 
    mid_angle = 0.5*(start_angle + end_angle)) 

ggplot(dat_pies) + 
geom_arc_bar(aes(x0 = imX, y0 = imY, r0 = 0, r = rpie, 
       start = start_angle, end = end_angle, fill = Volume)) + 
geom_text(aes(x = rlabel*sin(mid_angle), y = rlabel*cos(mid_angle), label = Cnt), 
     hjust = 0.5, vjust = 0.5) + 
coord_fixed() + 
scale_x_continuous(expand=c(0,0), lim=c(0,3)) + 
scale_y_continuous(expand=c(0,0), lim=c(0,6)) + 

Hier ist mein Fehler:

Jede Hilfe mit einer dieser Methoden wäre toll. dank

+0

Bitte definieren 'allcolors ' –

+0

allcolors = grDevices :: Farben() [grep ('gr (a | e) y', grDevices :: Farben(), invertieren = T)] – user2814482

+0

Ihre co de funktioniert nicht, weil Sie es nicht korrekt an Ihren Datensatz angepasst haben. In der Regel sollten Sie versuchen, jede Zeile eines Codesegments zu verstehen, bevor Sie versuchen, sie an Ihre Situation anzupassen. sonst werden die Dinge nicht funktionieren. Im Falle von "ggforce" verwenden Sie zum Beispiel immer Spaltennamen aus dem anderen Beispiel, soweit ich das beurteilen kann. Ich habe eine Antwort gepostet, die das 'ggforce'-Beispiel behebt und außerdem das Plotten auf Bildteil enthält. –

Antwort

2

In Ihrem ersten Versuch sollten Sie verwenden:

ggplot(wholebody_cutLH_wide_t) + 
    geom_scatterpie(aes(x=imX, y=imY,r=radius), 
    data=wholebody_cutLH_wide_t, 
    cols=colnames(wholebody_cutLH_wide_t)[1:2], 
    color=NA, alpha=.8) 

enter image description here

+0

danke großartig. Ich habe die Spalten geändert, dann habe ich den Radius auf 0,02 geändert, so dass sie sich nicht so sehr überlappen, und habe versucht, die Legende loszuwerden, und jetzt bekomme ich einen neuen Fehler. Ich habe meinen ursprünglichen Post bearbeitet. – user2814482

+0

@ user2814482 Warum hast du 'col' in' NA' geändert ??? Sie sollten 'cols = Spaltennamen (wholebody_cutLH_wide_t) [1: 2]' verwenden! –

+0

oops mein schlechtes. Ich habe versucht, die Farben richtig zu machen und cols für col zu halten. Aber scale_color_manual scheint nicht zu funktionieren. Scatterpie mit Farbe = NA gibt nicht genug Farben, so dass einige der Scheiben gleich sind – user2814482

0

Es sieht nicht so aus, wie Sie tatsächlich haben Ihren Code auf Ihre Daten angepasst. Hier ist das ggforce Beispiel oben geregelt:

wholebody_cutLH_wide_t <- read.table(text = "Acidobacteriaceae Actinomycetaceae imX imY radius 
     0.000000e+00  7.665687e-05 2.00 5.5 0.5 
     0.000000e+00  4.580237e-04 1.50 1.0 0.5 
     0.000000e+00  4.112573e-04 1.75 2.0 0.5 
     6.431473e-04  3.856008e-02 0.30 1.0 0.5 
     0.000000e+00  3.013013e-04 1.50 4.8 0.5 
     3.399756e-05  1.372986e-02 1.50 5.2 0.5", header = TRUE) 

library(tidyr) 
library(dplyr) 
library(ggforce) 

# convert to long format, add a grouping variable to keep track of which pies go together 
wholebody_cutLH_long <- mutate(wholebody_cutLH_wide_t, group=letters[1:6]) %>% 
    gather(type, amount, -imX, -imY, -radius, -group) 

dat_pies<-left_join(wholebody_cutLH_long, 
        wholebody_cutLH_long %>% 
         group_by(group) %>% 
         summarize(amount_total = sum(amount))) %>% 
    group_by(group) %>% 
    mutate(end_angle = 2*pi*cumsum(amount)/amount_total, 
     start_angle = lag(end_angle, default = 0)) 

# now draw 
ggplot(dat_pies) + 
    geom_arc_bar(aes(x0 = imX, y0 = imY, r0 = 0, r = radius, 
        start = start_angle, end = end_angle, fill = type)) + 
    coord_fixed() 

enter image description here

Und nun das gleiche auf dem Bild eines menschlichen Skeletts zeichnen:

library(cowplot) 

ggplot(dat_pies) + 
    draw_image("https://upload.wikimedia.org/wikipedia/commons/1/15/Human_skeleton_diagram.png", 
      x=0, y=0, width = 2.2, height = 6) + 
    geom_arc_bar(aes(x0 = imX, y0 = imY, r0 = 0, r = radius, 
        start = start_angle, end = end_angle, fill = type)) + 
    coord_fixed() 

enter image description here

Verwandte Themen