2014-11-05 11 views
7

Voglio stampare un grafico a bolle in R. Il problema che ho riscontrato è che entrambi, il mio xe il mio asse y sono discreti. In teoria questo significa che molti punti dati (bolle) finiscono sulla stessa coordinata. Preferirei che fossero sparsi per il punto dati, ma ancora all'interno di un quadrante che chiarisca che la bolla appartiene alla rispettiva coordinata x/y.Grafico a bolle con ggplot2

Penso che sia meglio dimostrarlo con un piccolo esempio. Il seguente codice dovrebbe evidenziare il problema:

# Example 
require(ggplot2) 
zz <- textConnection("Row PowerSource ProductSegment Price Model ManufacturingLocation Quantity 
1 High SegmentA Low ModA LocationA 5000 
2 Low SegmentB Low ModB LocationB 25000 
3 High SegmentC Low ModC LocationC 15000 
4 Low SegmentD High ModD LocationD 30000 
5 High SegmentE High ModE LocationA 2500 
6 Low SegmentA Low ModF LocationB 110000 
7 High SegmentB Low ModG LocationC 20000 
8 Low SegmentC Low ModH LocationD 3500 
9 High SegmentD Low ModI LocationA 65500 
10 Low SegmentE Low ModJ LocationB 145000 
11 High SegmentA Low ModK LocationC 15000 
12 Low SegmentB Low ModL LocationD 5000 
13 High SegmentC Low ModM LocationA 26000 
14 Low SegmentD Low ModN LocationB 14000 
15 High SegmentE Mid ModO LocationC 75000 
16 Low SegmentA High ModP LocationD 33000 
17 High SegmentB Low ModQ LocationA 14000 
18 Low SegmentC Mid ModR LocationB 33000 
19 High SegmentD High ModS LocationC 95000 
20 Low SegmentE Low ModT LocationD 4000 
") 
df2 <- read.table(zz, header= TRUE) 
close(zz) 
df2 


ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_point(aes(size = Quantity, colour = Price)) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

Come posso disperdere le bolle un po 'per mostrare i diversi prodotti in ogni categoria e la loro quantità?

(Scuse, non posso aggiungere un'immagine al momento a causa di troppo pochi reputazione)

enter image description here

+0

Re la tua ultima nota: aggiungi un link all'immagine per il post, qualcuno con un rappresentante sufficiente probabilmente lo sostituirà con l'immagine reale. – tonytonov

+0

Forse puoi usare geom_jitter (...) invece di geom_point e magari usare anche il parametro alpha per aggiungere trasparenza a causa della sovrapposizione. –

risposta

14

Come Tom Martens sottolineato regolazione alfa può mostrare sovrapposizioni. Il seguente livello alfa:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_point(aes(size = Quantity, colour = Price, alpha=.02)) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

risultati in:

enter image description here

Utilizzando geom_jitter invece di punti, in combinazione con alfa:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_jitter(aes(size = Quantity, colour = Price, alpha=.02)) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

produce questo:

enter image description here

EDIT: Per evitare il manufatto nella legenda alfa deve essere collocato al di fuori delle aes:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_point(aes(size = Quantity, colour = Price),alpha=.2) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

conseguente:

enter image description here

e:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource, label = Model)) + 
    geom_jitter(aes(size = Quantity, colour = Price),alpha=.2) + 
    geom_text(hjust = 1, size = 2) + 
    scale_size(range = c(1,15)) + 
    theme_bw() 

risultante in:

enter image description here

MODIFICA 2: Quindi, ci è voluto un po 'per capire.

Ho seguito l'esempio a cui mi sono collegato nel mio commento. Ho regolato il codice in base alle proprie esigenze. Innanzitutto ho creato i valori di jitter di fuori della trama:

df2$JitCoOr <- jitter(as.numeric(factor(df2$ManufacturingLocation))) 
df2$JitCoOrPow <- jitter(as.numeric(factor(df2$PowerSource))) 

Ho poi chiamato quei valori nei geom_point e geom_text coordinate X e Y. AES all'interno. Questo ha funzionato facendo tremare le bolle e abbinando le etichette a loro. Tuttavia ha incasinato le etichette degli assi xey così le ho reimpostate come si può vedere in scale_x_discrete e scale_y_discrete.Ecco il codice di terreno:

ggplot(df2, aes(x = ManufacturingLocation, y = PowerSource)) + 
geom_point(data=df2,aes(x=JitCoOr, y=JitCoOrPow,size = Quantity, colour = Price), alpha=.5)+ 
geom_text(data=df2,aes(x=JitCoOr, y=JitCoOrPow,label=Model)) + 
scale_size(range = c(1,50)) + 
scale_y_discrete(breaks =1:3 , labels=c("Low","High"," "), limits = c(1, 2))+ 
scale_x_discrete(breaks =1:4 , labels=c("Location A","Location B","Location C","Location D"), limits = c(1,2,3,4))+ 
theme_bw() 

che dà questo output:

enter image description here

È possibile regolare le dimensioni delle bolle via scale_size sopra. Ho esportato questa immagine con dimensioni di 1000 * 800.

Per quanto riguarda la richiesta di aggiungere bordi, penso che non sia necessario. È molto chiaro in questa trama in cui le bolle appartengono allo & Penso che i confini lo renderebbero un po 'brutto. Tuttavia, se vuoi ancora i confini, darò un'occhiata e vedrò cosa posso fare.

+0

Questo è quasi perfetto. Sai anche come ottenere le etichette accanto alla rispettiva bolla? Inoltre, il suggerimento di usare geom_jitter è assolutamente ottimo. Esattamente ciò che era necessario. Tuttavia, ora che le bolle finalmente fanno ciò che dovrebbero, come posso distinguere i diversi quadranti? C'è un modo per disegnare un rettangolo (o così) intorno a LocationA/High, LocationB/High e così via e così via? +1 e accettato se il problema delle etichette è stato risolto! – Roman

+0

Fornirà +1 non appena avrò 15 reputazione. Scuse. – Roman

+0

In questo momento non ho tempo per risolverlo, ma qualcosa come: geom_text (hjust = 1, size = 3, position = position_jitter()) farà sì che le etichette si sovrappongano ma sospetto che non corrisponderanno alle bolle. Controlla qui per avere un'idea di come affrontare il problema: http://stackoverflow.com/questions/6551147/adding-text-to-ggplot-geom-jitter-points-that-match-a-condition Avrò un guarda di nuovo domani. – Docconcoct