2016-11-09 39 views
7

我想通過在X軸上的一個類別來組織我的數據,但如本實施例通過另一個類着色它:geom_dotplot()將色彩美學後會失去躲閃

格拉夫1,沒有着色:

require(ggplot2) 
nocolor <- ggplot(mtcars, aes(x=as.factor(cyl), y=disp)) + 
    geom_dotplot(binaxis="y", stackdir = "center") 
print(nocolor) 

格拉夫2,用着色:

nododge <- ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
    geom_dotplot(binaxis="y", stackdir = "center") 
print(nododge) 

一個問題,引入着色後發生的是,屬於不同組的點不會躲閃彼此了。這會導致我的真實數據出現問題,因爲我會發現碰巧具有相同值且完全混淆的點。

然後我想這一點,但它亂碼我的數據:

圖3:

garbled <- ggplot(mtcars, aes(x=as.factor(cyl), y=disp)) + 
    geom_dotplot(binaxis="y", stackdir = "center", fill=as.factor(mtcars$gear)) 
print(garbled) 

的點閃避彼此,但着色僅僅是隨機的,是不正確的實際數據。

我預想的答案this question解決我的問題,但着色仍然隨機:

圖4:

graphdata <- mtcars 
graphdata$colorname <- as.factor(graphdata$gear) 
levels(graphdata$colorname) <- c("red", "blue", "black") 
jalapic <- ggplot(graphdata, aes(x=as.factor(cyl), y=disp)) + 
    geom_dotplot(binaxis="y", stackdir = "center", fill=as.character(graphdata$colorname)) 
print(jalapic) 

有沒有人有一個想法,如何讓圖形#2點至互相閃避,還是如何修正圖3或圖4中的着色?我非常感謝任何幫助,謝謝。

+0

在圖#2 ,你可以做'geom_dotplot(binaxis =「y」,stackdir =「center」,position =「dodge」)' – HubertL

+0

在單獨的x軸上着色組,這不是我期望的目光。我希望這些點仍然聚集在同一堆中,但可以通過顏色進行識別。我的問題實際上與Kristoffer Vitting-Seerup完全一樣,在這個[link](http://stackoverflow.com/questions/31557973/how-to-use-ggplot2s-geom-dotplot -with-既 - 填充 - 和 - 基團)。儘管如此,我無法在jalapic的答案中找到解決方案。 – naco

回答

5

使用binpositions = "all"stackgroups = TRUE

ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
    geom_dotplot(binaxis="y", stackdir = "center", binpositions="all", stackgroups=TRUE) 

給出:

enter image description here

可能的替代方法是使用stackdir = "up"

ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
    geom_dotplot(binaxis="y", stackdir = "up", binpositions="all", stackgroups=TRUE) 

其給出:

enter image description here

+0

這比我開始的地方好多了,謝謝!我能夠用我的原始數據複製這個。但是,它看起來有點奇怪。它看起來像拼圖碎片彼此分開。當你用mtcars數據的mpg變量嘗試時,它會更加明顯: 'ggplot(mtcars,aes(x = as.factor(cyl),y = mpg,fill = as.factor(gear))) + geom_dotplot(binaxis =「y」,stackdir =「center」,binpositions =「all」,stackgroups = TRUE)' 你介意試試這個,讓我知道是否有一個奇怪的外觀解決方案?否則,我已經給你答案了。 – naco

+1

@ naco可能使用'stackdir =「up」'?看到更新 – Jaap

2

這裏有可能比點陣圖更好地工作,根據您的需要的另一種選擇。我們繪製各個點,但我們將它們分開,以便每個點都可見。

在我最初的答案中,我使用了position_jitterdodge,但該方法的隨機性導致重疊點並且對點佈局的控制很少。下面是一個更新的方法,直接控制點的位置,以防止重疊。

在下面的例子中,我們有cyl作爲x變量,disp爲y變量,gear作爲顏色美感。

  • 在每個cyl之內,我們希望點數可以被gear迴避。
  • 在每個gear之內,我們希望具有類似值disp的點在水平方向上分開,以便它們不重疊。

我們通過對cyl的值添加適當的增量來實現這一點,以便移動點的水平位置。我們用兩個參數來控制它:dodge將點組分成gear,而sep控制具有相似值disp的每個gear內的點的分離。我們通過創建一個名爲dispGrp的分組變量來確定「disp的相似值」,它只是將disp舍入到最近的十個值(儘管這當然可以根據數據的大小,繪製點的大小,和圖形的物理大小)。

要確定每個點的x值,我們先從cyl值中,添加gear閃躲,最後由依賴於點的數量內的每個金額擴頻每個geardispGrp組合內的點分組。

所有這些數據轉換都在dplyr鏈內完成,然後將生成的數據幀發送到ggplot。數據轉換和繪圖的順序可以概括爲一個函數,但下面的代碼只涉及問題中的具體情況。

library(dplyr) 
library(ggplot2) 

dodge = 0.3 # Controls the amount dodging 
sep = 0.05 # Within each dodge group, controls the amount of point separation 

mtcars %>% 
    # Round disp to nearest 10 to identify groups of points that need to be separated 
    mutate(dispGrp = round(disp, -1)) %>% 
    group_by(gear, cyl, dispGrp) %>% 
    arrange(disp) %>% 
    # Within each cyl, dodge by gear, then, within each gear, separate points 
    # within each dispGrp 
    mutate(cylDodge = cyl + dodge*(gear - mean(unique(mtcars$gear))) + 
      sep*seq(-(n()-1), n()-1, length.out=n())) %>% 
    ggplot(aes(x=cylDodge, y=disp, fill=as.factor(gear))) + 
    geom_point(pch=21, size=2) + 
    theme_bw() + 
    scale_x_continuous(breaks=sort(unique(mtcars$cyl))) 

enter image description here

這是我的原來的答覆,使用position_jitterdodge躲閃通過顏色,然後將每個顏色組中的抖動來分離重疊點:

set.seed(3521) 
ggplot(mtcars, aes(x=factor(cyl), y=disp, fill=as.factor(gear))) + 
    geom_point(pch=21, size=1.5, position=position_jitterdodge(jitter.width=1.2, dodge.width=1)) + 
    theme_bw() 

enter image description here

+0

這是我想到的另一種選擇,我還沒有嘗試過。很高興看到它的工作,謝謝!但是,有沒有辦法讓點完全相互閃避?我嘗試增加jitter.width,這會在不完全消除重疊的情況下將點擴散得太多。 我想讓他們完全躲避另一個,這樣我就可以將alpha增加到1.任何想法? – naco

+0

我已經更新了我的答案,使用更小的點大小和更多的抖動。在使用足夠小的閃避以防止x軸類別重疊的情況下,可能很難完全分離所有點,但是您可以隨時查看是否可以獲得您喜歡的內容。 – eipi10

+1

我已經用避免各個點重疊的新方法更新了我的答案。 – eipi10