如何在ggplot2中单独标记和缩放双y轴?

时间:2017-05-01 16:21:56

标签: r ggplot2

我有一个像这样的测试数据集:

df_test <- data.frame(
  proj_manager = c('Emma','Emma','Emma','Emma','Emma','Alice','Alice'),
  proj_ID = c(1, 2, 3, 4, 5, 6, 7), 
  stage = c('B','B','B','A','C','A','C'),
  value = c(15,15,20,20,20,70,5)
)

准备工作:

input <- select(df_test, proj_manager, proj_ID, stage, value) %>%
  filter(proj_manager=='Emma') %>%
  do({
    proj_value_by_manager = sum(distinct(., proj_ID, value)$value);
    mutate(., proj_value_by_manager =  proj_value_by_manager)
  }) %>%
  group_by(stage) %>%
 do({
    sum_value_byStage = sum(distinct(.,proj_ID,value)$value);
    mutate(.,sum_value_byStage= sum_value_byStage)
  }) %>%
  mutate(count_proj = length(unique(proj_ID))) 

commapos <- function(x, ...) {
  format(abs(x), big.mark = ",", trim = TRUE,
  scientific = FALSE, ...) }

可视化:

ggplot (input, aes(x=stage, y = count_proj)) + 
  geom_bar(stat = 'identity')+
  geom_bar(aes(y=-proj_value_by_manager), 
      stat = "identity", fill = "Blue") + 
  scale_y_continuous(labels = commapos)+
  coord_flip() +
  ylab('') +
  geom_text(aes(label= sum_value_byStage), hjust = 5) +
  geom_text(aes(label= count_proj), hjust = -1) +
  labs(title = "Emma: 4 projects| $90M Values \n   \n Commitment|Projects") +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_hline(yintercept = 0, linetype =1)

enter image description here

我的问题是:

  1. 为什么y值不能正确显示?例如C标记为20,但在规模上接近达到100。
  2. 如何调整标签的位置以使其位于条形图的顶部?
  3. 如何重新缩放y轴,以便计算出非常短的项目数。和长期的项目价值&#39;可以很好地展示吗?
  4. 谢谢大家的帮助!

1 个答案:

答案 0 :(得分:0)

我认为你的问题来自以下事实:

(1)您的数据集具有重复值。这会导致geom_bar将所有这些添加到一起。例如,B有{3}个proj_value_by_manager = 90,这就是为什么蓝色条扩展到该组270的原因(它们都被添加)。

(2)在您的第二个geom_bar中使用y = -proj_value_by_manager,但在geom_text中标注此项,则使用sum_value_byStage。这就是为什么A的蓝色栏延伸到90(因为proj_value_by_manager为90),但标签显示为20

为了得到我认为你想要的图表,你可以做到:

#Q1: No dupe dataset so it doesnt erroneous add columns
input2 <- input[!duplicated(input[,-c(2,4)]),]

ggplot (input2, aes(x=stage, y = count_proj)) + 
  geom_bar(stat = 'identity')+
  geom_bar(aes(y=-sum_value_byStage), #Q1: changed so this y-value matches your label
           stat = "identity", fill = "Blue") + 
  scale_y_continuous(labels = commapos)+
  coord_flip() +
  ylab('') +
  geom_text(aes(label= sum_value_byStage, y = -sum_value_byStage), hjust = 1) + #Q2: Added in y-value for label and hjust so it will be on top
  geom_text(aes(label= count_proj), hjust = -1) +
  labs(title = "Emma: 4 projects| $90M Values \n   \n Commitment|Projects") +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_hline(yintercept = 0, linetype =1)

对于你的上一个问题,没有好办法显示这两个问题。一种选择是重新缩放小数据,并使用13对其进行标记。但是,我没有做到这一点,因为一旦你缩小蓝色条,其他条对我来说看起来不错。

enter image description here