2017-05-01 11 views
0

私はこのようなテストデータセットを持っている:すなわちためggplot2でy軸の2倍のラベル付けとスケールを行う方法は?

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. 「プロジェクトの数」の非常に短いバーと ' 「プロジェクト価値」はうまく表示できますか?

ありがとうございました!

答えて

0

私はあなたの問題があるという事実から来ていると思う:

(1)あなたのデータセットに値が重複しています。これにより、geom_barはすべてを一緒に追加します。たとえば、Bには3つのobsがあります。その理由は、青いバーがそのグループの270に拡張されている理由です(すべてが追加されます)。proj_value_by_manager = 90です。

(2)geom_barの場合はy = -proj_value_by_managerを使用しますが、geom_textの場合はsum_value_byStageとします。そのため、Aの青いバーは90proj_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) 

あなたの最後の質問のために、これらの両方を表示するための良い方法はありません。 1つの選択肢は、小さなデータを再スケーリングすることであり、それでも1または3というラベルを付けることです。しかし、私はこれをやっていませんでした。なぜなら、あなたが青いバーを縮小すると、他のバーは私には見えてしまうからです。

enter image description here

+0

ありがとうございました!助けになる。 3番目の質問では、私の実際のデータは2000年以上の価値を持つプロジェクトを持っているため、プロジェクトの数を非常に少なくすることができます。 – Daisywang

+0

@Daisywangこれを調整する簡単な方法はありません。http://stackoverflow.com/questions/3099219/plot-with-2-y-axes-one-y-axis-on-the-left-and-another-右上のy軸。私の提案はあなたのデータを再スケーリングすることです、またはあなたはそれの上にプロジェクトの数を持っている青いバーの隣に別のプロットをすることができます。 –

関連する問題