在躲避条形图中绘制可变位置

时间:2017-05-20 02:09:26

标签: r ggplot2 charts bar-chart

我有一个从mtcars数据集生成的躲闪条形图,显示齿轮与圆柱的直方图。我想在图表上标记一个特定的汽车标记 - 附图表将更好地说明这一点。代码正在做它应该做的事情(点与x轴标签cyl一致)但我希望这些点与正确的条形对齐,显示齿轮的数量。有什么想法吗?

require(graphics)
carsraw <- mtcars

cars <- mtcars  %>% 
  select(cyl,gear) %>% 
  mutate(cyl=as.factor(cyl),gear=as.factor(gear)) %>% 
  group_by(cyl,gear) %>% 
  tally() %>% 
  rename(count=n)

Hornet <- mtcars %>% 
  add_rownames("model") %>% 
  filter(model %in% c("Hornet 4 Drive","Hornet Sportabout")) %>% 
  mutate(cyl=as.factor(cyl),gear=as.factor(gear)) %>% 
  mutate(count=7) %>% 
  select(model,cyl,gear,count)

(ggplot(data=cars)+
    aes(x=cyl,y=count,fill=gear) +
    geom_bar( position = "dodge", stat="identity")+
    geom_point(data=Hornet,size=5)+
    aes(x=cyl,y=count,fill=gear))

enter image description here

1 个答案:

答案 0 :(得分:1)

你可以尝试在这种特殊情况下使用position_nudge,虽然这有点像黑客攻击:

(ggplot(data=cars)+
    aes(x=cyl,y=count,fill=gear) +
    geom_bar( position = "dodge", stat="identity")+
    geom_point(data=Hornet,size=5, position = position_nudge(-0.25))+
    aes(x=cyl,y=count,fill=gear))

enter image description here

修改

鉴于OP的评论,这里有一个替代方案可以稍微改变数据的准备。我在这里做的是将整个模型中的模型存在作为汇总函数中的Hornet列(并为(NAcyl)对添加gear不包括特定型号)。此外,您必须使用group = gearposition = position_dodge(1)

library(tidyverse)    
cars <- mtcars  %>% 
    rownames_to_column("model") %>% 
    mutate(cyl=as.factor(cyl),gear=as.factor(gear)) %>% 
    group_by(cyl,gear) %>% 
    summarise(
        count = n(),
        Hornet = ifelse(
            any(model %in% c("Hornet 4 Drive","Hornet Sportabout")),
            7,
            NA
        )
    ) %>% ungroup()

cars %>% ggplot() + 
    geom_col(
        aes(
            x = cyl,
            y = count,
            fill = gear
        ),
        position = "dodge"
    ) +
    geom_point(
        aes(
            x = cyl,
            y = Hornet,
            group = gear
        ),
        na.rm = TRUE,
        position = position_dodge(1),
        size = 5
    )