2014-11-05 3 views
7

Я хочу напечатать пузырьковую диаграмму в R. Проблема, с которой я сталкиваюсь, состоит в том, что обе оси x и y y являются дискретными. Теоретически это означает, что множество точек данных (пузырьков) заканчиваются на одной и той же координате. Я предпочел бы, чтобы они рассеялись вокруг точки данных, но все же в пределах квадранта, который ясно показывает, что пузырь относится к соответствующей координате x/y.Bubble Chart with ggplot2

Я думаю, что это лучше всего продемонстрировать на небольшом примере. Следующий код должен выделить проблему:

# 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() 

Как я могу рассеять пузыри немного, чтобы показать различные продукты в каждой категории и их количество?

(Извиняюсь, я не могу добавить изображение в данный момент из-за слишком мало репутации)

enter image description here

+0

Повтор вашей последней заметки: добавьте ссылку на изображение для сообщения, кто-то с достаточным количеством rep, скорее всего, заменит его фактическим изображением. – tonytonov

+0

Возможно, вы можете использовать geom_jitter (...) вместо geom_point и, возможно, также использовать альфа-параметр, чтобы добавить прозрачность из-за перекрытия. –

ответ

14

Как Том Мартенс отметил, регулируя альфа может показать любое перекрытие. Следующий уровень альфа:

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() 

приводит:

enter image description here

Используя geom_jitter вместо точки, в сочетании с альфа:

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() 

производит это:

enter image description here

EDIT: Для того, чтобы избежать артефакта в легенде альфа должны быть размещены за пределами АЭ:

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() 

в результате:

enter image description here

и:

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() 

, в результате чего:

enter image description here

EDIT 2: Итак, это заняло некоторое время, чтобы разобраться.

Я последовал примеру, на который я ссылался в своем комментарии. Я скорректировал код в соответствии с вашими потребностями. Прежде всего я создал значения джиттера за пределами участка:

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

Я тогда назвал эти значения в geom_point и geom_text х и у координаты внутри ИСЗ. Это сработало, дрогнув пузырьки и соответствующие ярлыки к ним. Однако он испортил метки оси x и y, поэтому я их заменил, как это видно в scale_x_discrete и scale_y_discrete.Вот код участка:

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() 

Что дает этот вывод:

enter image description here

Вы можете отрегулировать размер пузырьков через scale_size выше. Я экспортировал это изображение размером 1000 * 800.

Что касается вашего запроса на добавление границ, я думаю, что это не нужно. На этом участке очень ясно, где пузыри принадлежат & Я думаю, что границы бы сделали его немного уродливым. Однако, если вы все еще хотите границы, я посмотрю и посмотрю, что я могу сделать.

+0

Это почти идеально. Вы также знаете, как получить ярлыки рядом с соответствующим пузырем? Кроме того, предложение использовать geom_jitter абсолютно велико. Именно то, что нужно. Однако теперь, когда пузырьки, наконец, делают то, что они предполагают, как я могу различать разные квадранты? Есть ли способ рисовать прямоугольник (или около того) вокруг LocationA/High, LocationB/High и т. Д. И т. Д.? +1 и принимается при сортировке ярлыков! – Roman

+0

Дает +1, как только у меня будет репутация 15. Извиняюсь. – Roman

+0

У меня нет времени прямо сейчас, чтобы решить это, но что-то вроде: geom_text (hjust = 1, size = 3, position = position_jitter()) остановит перекрытие палитр, но я подозреваю, что они не будут соответствовать пузырькам. Проверьте здесь, как решить эту проблему: http://stackoverflow.com/questions/6551147/adding-text-to-ggplot-geom-jitter-points-that-match-a-condition У меня будет снова посмотри завтра. – Docconcoct