2017-10-16 7 views
2

凡例を私のプロットの1つに追加したいのですが、さまざまな美学があり、凡例を作成したことはありません。さまざまなタイプの美学を持つggplotヒストグラムに凡例を追加します

私の美学の1つは、手動でベクトルとして追加した塗りつぶしコードです。もう一つの美学は、geom_vlineで追加した縦線です。

以下のグラフから、凡例に追加する3つの特性があります。1)濃い青色のバー、2)薄い青色のバー、3)縦線。

これを効率的にコーディングする方法について、誰かから私に提案がありますか?

#df 
df <- data.frame(Time_Diff <- runif(1000, 0, 200)) 


# Show median, IQR range and outliers 
colors <- c(rep("blue",3), rep("paleturquoise2",38)) 
bp_overall <- ggplot(data = df, aes(Time_Diff)) 
bp_overall + 
    geom_histogram(binwidth = 5, fill = colors) + #create histogram 
    ggtitle("Time Difference") + 
    xlab("Time in Days") + 
    ylab("Amount") + 
    geom_vline(xintercept = 3, linetype = "twodash", size = 1,  colour= "darkblue") + #show median 
    scale_x_continuous(breaks = seq(0, 202, 10)) + 
    theme_light() + 
    theme(panel.grid.minor = element_blank(), 
    panel.border = element_blank(), #remove all border lines 
    axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), #add x-axis border line 
    axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) + #add y-axis border line 
    theme(plot.title = element_text(family = windowsFont("Verdana"),  color="black", size=14, hjust = 0.5)) + 
    theme(axis.title = element_text(family = windowsFont("Verdana"), color="black", size=12)) 

Djorkの提案の後、私は次のスクリプトに到着しました。このスクリプトはうまくいきました。私は満足しています。私が現在達成しようとしている唯一のことは、伝説を一つの全体にすることです(ヒストグラムの伝説と線の伝説は一貫性のある全体に結合されます)。誰でも提案がありますか?私はJimbouの提案@考える

# reformat data 
set.seed(1) 
df <- data.frame(runif(1000, 0, 200)) 
colnames(df) <- "Time_Diff" 

bp_overall + 
    geom_histogram(data = subset(df, Time_Diff <= 12.5), aes(x = Time_Diff, fill="BAR BLUE"), binwidth = 5) + # subset for blue data, where aes fill is fill group 1 label 
    geom_histogram(data = subset(df, Time_Diff > 12.5), aes(x = Time_Diff, fill="BAR TURQUOISE"), binwidth = 5) + # subset for turquoise data, where aes fill is fill group 2 label 
    scale_fill_manual("Histogram Legend", values=c("blue", "paleturquoise2")) + # manually assign histogram fill colors 
    geom_vline(aes(xintercept = 3, colour="LINE DARK BLUE"), linetype="twodash", size = 1) + # where aes colour is vline label 
    scale_colour_manual("Line Legend", values="darkblue") + #removed legend title 
    scale_x_continuous(breaks = seq(0, 202, 10)) + 
    ggtitle("Time Difference") + 
    xlab("Time in Days") + 
    ylab("Amount") + 
    theme_light() + 
    theme(panel.grid.minor = element_blank(), 
     panel.border = element_blank(), 
     axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), 
     axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black"), 
     legend.position = c(0.95, 0.95), 
     legend.justification = c("right", "top"), 
     legend.box.just = ("right")) 
+0

legend.marginを使用して上下に余白を取り除きますこの伝説は 'aes()'の中に特性を指定することです。したがって、統計と列を含むdata.frameを色で変換する必要があります。 [ここ](http://www.cookbook-r。com/Graphs/Legends_(ggplot2)/)または[ここ](https://stackoverflow.com/questions/24932940/ggplot-does-not-show-legend-in-geom-histogram) – Jimbou

+0

@ジンバウ私は理解していると思うデータフレームを変換することとはどういう意味ですか?私はこの問題を解決しました(下記のコードを参照してください)。しかし、ggplotの図のコードを調整する方法がわかりません。 – SHW

答えて

3

が好ましいが、回避策geom_histogramaesfill値とgeom_vlineaescolour値に文字値を割り当てることによって人為的に伝説を作成するためのがあり、その後、scale_fill_manualscale_colour_manualで色を設定します。

しかし、このアプローチにはaesfillは、唯一の値(長さ1)かかりますので、あなたは青とターコイズの値のためのあなたのdfをサブセットし、あなたのbinwidthによって決まるカットオフで、それぞれのヒストグラムをプロットする必要があります。

ここにアプローチがあります。データを再フォーマットする必要があることに注意してください。

# reformat data 
set.seed(1) 
df <- data.frame(runif(1000, 0, 200)) 
colnames(df) <- "Time_Diff" 


bp_overall <- ggplot(data = df) 
bp_overall + 
    geom_histogram(data = subset(df, Time_Diff <= 12.5), aes(x = Time_Diff, fill="BAR BLUE"), binwidth = 5) + # subset for blue data, where aes fill is fill group 1 label 
    geom_histogram(data = subset(df, Time_Diff > 12.5), aes(x = Time_Diff, fill="BAR TURQUOISE"), binwidth = 5) + # subset for turquoise data, where aes fill is fill group 2 label 
    scale_fill_manual("Histogram Legend", values=c("blue", "paleturquoise2")) + # manually assign histogram fill colors 
    geom_vline(aes(xintercept = 3, colour="LINE DARK BLUE"), linetype="twodash", size = 1) + # where aes colour is vline label 
    scale_colour_manual("Line Legend", values="darkblue") + # manually assign vline colors 
    scale_x_continuous(breaks = seq(0, 202, 10)) + 
    ggtitle("Time Difference") + 
    xlab("Time in Days") + 
    ylab("Amount") + 
    theme_light() + 
    theme(panel.grid.minor = element_blank(), 
    panel.border = element_blank(), 
    axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), 
    axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black")) 

その他あなたの残りのを追加してください。

enter image description here

EDITED:伝説を統一し、2伝説の種類

(1)scale_fill_manualの「」に設定することにより、VLINEの凡例nameを削除、変更ヒストグラムフィルとの間隔を小さくする方法についての質問に答えるために凡例namescale_colour_manualの "凡例"に変更します。

(2)凡例が表示されるorderを指定してから、guidesguide_legendを使用して最初に塗りつぶします。

(3)を取得する最も簡単な方法0legend.spacing.yを設定することにより、2つの凡例タイプ間のyの間隔を削除し、そしてtheme

bp_overall <- ggplot(data = df) 
bp_overall + 
    geom_histogram(data = subset(df, Time_Diff <= 12.5), aes(x = Time_Diff, fill="BAR BLUE"), binwidth = 5) + 
    geom_histogram(data = subset(df, Time_Diff > 12.5), aes(x = Time_Diff, fill="BAR TURQUOISE"), binwidth = 5) + 
    scale_fill_manual(name="Legend", values=c("blue", "paleturquoise2")) + 
    geom_vline(aes(xintercept = 3, colour="LINE DARK BLUE"), linetype="twodash", size = 1) + 
    scale_colour_manual(name="", values="darkblue") + 
    scale_x_continuous(breaks = seq(0, 202, 10)) + 
    ggtitle("Time Difference") + 
    xlab("Time in Days") + 
    ylab("Amount") + 
    theme_light() + 
    theme(panel.grid.minor = element_blank(), 
    panel.border = element_blank(), 
    axis.line.x = element_line(size = 0.5, linetype = "solid", colour = "black"), 
    axis.line.y = element_line(size = 0.5, linetype = "solid", colour = "black"), 
    legend.spacing.y = unit(0, "cm"), 
    legend.margin=margin(t=0, r=0.5, b=0, l=0.5, unit="cm")) + 
    guides(fill = guide_legend(order = 1), 
    colour = guide_legend(order = 2)) 

enter image description here

+0

ありがとうございます。あなたとジムドーはどちらも、これを行うためのもっときちんとした方法があることを示しているからです。データフレームを変換してggplotを使用するのに適したコードを少し追加しましたが、そこから取得する方法はわかりません。私の問題で新しいコードをチェックできますか? – SHW

+0

自分のコードを自分のものに変換しようとしましたが、次のようなエラーが表示されます: 'エラー:美学は長さ1またはデータ(77):x、fill、binwidth'と同じでなければなりません。 DFを作り直すとどういう意味ですか? – SHW

+0

エラーをトラブルシューティングするためにエラーを再現するデータまたはサブセットを提供する必要がありますが、私が上記で使用したものである1文字を 'aes'よりも長く与える可能性があります。 – Djork

関連する問題