首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >geom_dotplot()在色彩美学中的应用

geom_dotplot()在色彩美学中的应用
EN

Stack Overflow用户
提问于 2016-11-09 21:21:29
回答 2查看 1.7K关注 0票数 8

我希望将数据按X轴上的一个类别组织,但按另一个类别(如本例中所示)对其进行颜色设置:

图1,不着色:

代码语言:javascript
复制
require(ggplot2)
nocolor <- ggplot(mtcars, aes(x=as.factor(cyl), y=disp)) + 
  geom_dotplot(binaxis="y", stackdir = "center")
print(nocolor)

带有着色的图2:

代码语言:javascript
复制
nododge <- ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
  geom_dotplot(binaxis="y", stackdir = "center")
print(nododge)

引入着色后出现的一个问题是,属于不同组的点不再相互回避。这会给我的真实数据带来问题,因为我得到的点恰好具有相同的值,并且完全模糊了彼此。

然后我试了一下,但它混淆了我的数据:

图3:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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中固定着色?我真的很感谢你的帮助,谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-09 21:40:22

使用binpositions = "all"stackgroups = TRUE

代码语言:javascript
复制
ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
  geom_dotplot(binaxis="y", stackdir = "center", binpositions="all", stackgroups=TRUE)

给予:

一种可能的选择是使用stackdir = "up"

代码语言:javascript
复制
ggplot(mtcars, aes(x=as.factor(cyl), y=disp, fill=as.factor(gear))) + 
  geom_dotplot(binaxis="y", stackdir = "up", binpositions="all", stackgroups=TRUE)

这意味着:

票数 7
EN

Stack Overflow用户

发布于 2016-11-09 22:15:48

根据您的需要,这里还有另一种可能比点图更有效的选择。我们绘制各个点,但将它们分开,这样每个点都是可见的。

在我最初的答案中,我使用了position_jitterdodge,但是这种方法的随机性导致了点的重叠和对点位置的控制。下面是一个更新的方法,直接控制点的位置,以防止重叠。

在下面的例子中,我们使用cyl作为x变量,disp作为y变量,gear作为颜色美学。

  • 在每个cyl中,我们都希望gear能避开点数。
  • 在每个gear中,我们希望具有disp相似值的点水平地分开,这样它们就不会重叠。

我们通过向cyl的值添加适当的增量来实现这一点,以便移动点的水平位置。我们使用两个参数来控制这一点:dodge通过gear来分离各点组,而sep则控制具有类似disp值的每个gear内的点的分离。我们通过创建一个名为disp的分组变量来确定“类似的值”,该变量仅将disp四舍五入到最接近的10(当然,这可以根据数据的规模、绘制点的大小和图形的物理大小进行调整)。

为了确定每个点的x值,我们从cyl的值开始,通过gear添加闪避,最后将每个geardispGrp组合中的点数按依赖于每个分组内点数的数量进行分配。

所有这些数据转换都是在dplyr链中完成的,然后将结果数据帧输入ggplot。数据转换和绘图的顺序可以概括为一个函数,但是下面的代码只处理问题中的具体情况。

代码语言:javascript
复制
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)))

这是我最初的答案,使用position_jitterdodge按颜色躲闪,然后在每个颜色组内抖动以分离重叠点:

代码语言:javascript
复制
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()

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40516227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档