2016-11-17 12 views
3

マイセットアップから表示テキストラベル:ggplot2:1グループのみ

私はバスケットボールの選手とその統計のtibbleを持っています。

library(tidyverse) 

df <- tibble(
    season = c(2010, 2011, 2012, 2013, 2014, 
      2010, 2011, 2012, 2013, 2014), 
    player = c("player_a", "player_a", "player_a", "player_a", "player_a", 
      "league_avg", "league_avg", "league_avg", "league_avg", "league_avg"), 
    fg_perc = c(.4912, .6083, .3095, .5525, .4289, 
       .4825, .4836, .4819, .4860, .4848), 
    points_game = c(20, 18, 15, 19, 18, 
        12, 12, 13, 11, 12) 
) 

私はplayer_aとleague_avgの両方のためのgeom_line()などの特定のカラム(fg_perc)を表示しました。私は他の統計にも同じメソッドを使用するので、カスタム関数でラップしました。

make_chart <- function(target_column) { 
    df %>% 
    ggplot(aes_string("season", target_column, label = target_column)) + 
    geom_line(aes(color = player), size = 1.33) 
} 

make_chart("fg_perc") 

私の問題:

私だけplayer_aデータの割合としてfg_perc値を表示したいです。伝説をなくさずに(私が()league_avgを広げたとき)これをどうやって行うのか分かりません。私は非パーセンテージをそのままにして同様の方法で表示できるソリューションを探しています(例えば、player_aのpoints_gameのみ)。出力は(MSペイントを言い訳してください)、次のようになります

enter image description here

感謝を!

+1

使用率を表示するには、 'geom_text'、あなただけのplayer_A – timat

+1

でそれを制限するあなたが、私はこの質問をupvotedているため再現性の例を、含ま素晴らしいです。しかし、あなたは例をあまりにも複雑すぎるようにしました。 'tibble 'を使うと、人々はいくつかのパッケージをダウンロードする必要がありますが、これは' data.frame'でも扱うことができます。また、プロットする関数は、読むのが難しくなります。できるだけ簡単に質問に答えるようにしてください。これは、人々がボランティアをしてあなたを助けるチャンスを増やします。 –

+0

私はあなたが言っていることを見ます。次回にやります。 –

答えて

1

あなたがハードコーディングせずにmake_chart機能を使用する場合は、非標準的な評価(NSE)を使用することをお勧めします。 tidyverse関数の多くは関数名の後に_で示されるnseバージョンを持っています。プログラムでこれらのバージョンを使用している場合は、これらのバージョンを使用します。

aesおよびfilter,aes_およびfilter_のnseバージョンを使用した概略的な例を以下に示します。 nseを使って関数をビルドすると、ここで行ったことよりもはるかに多くの機能があります。詳細はdplyr vignette on nseをお読みください。

私は単純にifelseではなくfilter_という@OmaymaSのソリューションを複製しました。私はplayer_highlightパラメータと共に、データパラメータ.dataを関数に追加する自由を取った。 .dataはあなたの機能を配管可能にし、player_highightはハイライトしたいプレイヤーを選ぶことができます(おそらく2つ以上になります)。あなたは機能を拡張したいと思うでしょうし、そうするべきです!

library(tidyverse) 

df <- data_frame(
    season = c(2010, 2011, 2012, 2013, 2014, 
      2010, 2011, 2012, 2013, 2014), 
    player = c("player_a", "player_a", "player_a", "player_a", "player_a", 
      "league_avg", "league_avg", "league_avg", "league_avg", "league_avg"), 
    fg_perc = c(.4912, .6083, .3095, .5525, .4289, 
       .4825, .4836, .4819, .4860, .4848), 
    points_game = c(20, 18, 15, 19, 18, 
        12, 12, 13, 11, 12) 
) 


make_chart <- function(.data, target_column, player_highlight) { 
    ggplot(.data, aes_(x = ~season, y = as.name(target_column))) + 
    geom_line(aes_(color = ~player), size = 1.33) + 
    geom_text(data = filter_(.data, ~ player == player_highlight), aes_(label = as.name(target_column))) 
} 

make_chart(df,"fg_perc","player_a") 

df %>% 
    make_chart("fg_perc","player_a") 
+0

それは(OmaymaSの回避策に加えて)記号でした。 –

3

チェックこのアウト: あなたはgeom_text内ifelseを使用して条件を設定することができます

  • プレイヤーは==興味のプレーヤーを、ラベルは%値そう

  • になる場合、ラベルは空白になります。 ""

あなたはどんな条件でも、複数のプレイヤーでも構いません。

df %>% 
     ggplot(aes(season,fg_perc))+ 
     geom_line(aes(color = player), size = 1.33)+ 
     geom_text(aes(label=ifelse(player=="player_a",paste0(100*fg_perc,"%")," "))) 

enter image description here

EDIT

あなたが関数内のコードをラップしたい場合、あなたはあなたができるようにgeom_text内をaes_string を使用して、以下を試す使用することができます列名を文字列として渡します。あなたは(DFを渡す前に、または変異させる)機能内で事前に100で列を掛けることができます

  • make_chart <- function(target_column) { 
    
        df[,target_column] <- 100*df[,target_column] 
    
        df %>% 
          ggplot(aes_string("season", target_column)) + 
          geom_line(aes(color = player), size = 1.33) + 
          geom_text(data=filter(df,player=="player_a"), 
             aes_string(label=target_column))+ 
          # a work around to add the % sign 
          geom_text(data=filter(df,player=="player_a"), 
             aes(label="%"), 
             hjust=-1.5) } 
    
  • はケースでは、すべてのターゲット列はパーセンテージであります

enter image description here

+1

+1、なぜこれが実際に機能するのかもっと説明できますか?これはOPとインターネットの他の部分にとってより価値のあるものになるでしょう。 –

+2

フィードバックをいただきありがとうございます。簡単な説明が追加されました。 – OmaymaS

+0

ありがとうございました。それはカスタムのmake_chart()関数の内部でまだ動作していません。他の多くの統計を実行するときに、ハードコーディングを避けるために、引数として列名を渡そうとしています。それは理にかなっていますか? –

3

ここにトリックは微調整label美的でgeom_labelジオメトリを使用することです:

df %>% ggplot(aes(season, fg_perc, color = player)) + 
    geom_line() + 
    geom_label(aes(label = ifelse(player == 'league_avg', NA, fg_perc))) 

だから今playerleague_avgであれば、我々はNAfg_perc値を設定するだけlabelのために、これはプロットからそれらを省略しています。

enter image description here

+2

なぜgeom_label(data = filter(df、player == "player_a") 'ループを保存するのでしょうか? – Nate

+1

私はあなたの解決策、 –

+0

ありがとうございます;それはカスタム 'make_chart()'関数の中でまだ動作していませんが、私は引数として列名を渡そうとしています。私は他の多くの統計のために走っていますが、 'aes_string()'でフォーマットするのではなく、%の書式では書式化を行わないようにしています –

関連する問題