web-dev-qa-db-ja.com

毎秒Rggplot2 x軸ラベル値を表示する方法は?

プレゼンテーションでx軸ラベルリストを毎秒表示したいと思います。次の簡略化されたコード例と図1の出力では、4つの日付が示されていますが、#2と#4はスキップする必要があります。

_# https://stackoverflow.com/a/6638722/54964
require(ggplot2)
my.dates = as.Date(c("2011-07-22","2011-07-23",
                     "2011-07-24","2011-07-28","2011-07-29"))
my.vals  = c(5,6,8,7,3)
my.data <- data.frame(date =my.dates, vals = my.vals)
plot(my.dates, my.vals)
p <- ggplot(data = my.data, aes(date,vals))+ geom_line(size = 1.5)
_

期待される出力:2番目と4番目の日付をスキップします。

実際のコード

rev(Vars)ロジックのため、各カテゴリの値に_as.Date_を適用できない実際のコード。変数moltenには列Datesがあります

_p <- ggplot(molten, aes(x = rev(Vars), y = value)) + 
    geom_bar(aes(fill=variable), stat = "identity", position="dodge") + 
    facet_wrap( ~ variable, scales="free") +
    scale_x_discrete("Column name dates", labels = rev(Dates)) 
_

期待される出力:各カテゴリの#2、#4、...の値をスキップします。ここで_scale_x_discrete_を_scale_x_continuous_に変更し、_scale_x_continuous_にブレークシーケンスbreaks = seq(1,length(Dates),2))があると思いましたが、次のエラーのために失敗します。

_Error: `breaks` and `labels` must have the same length 
_

提案に基づくフアンのコメント

コード

_ggplot(data = my.data, aes(as.numeric(date), vals)) + 
  geom_line(size = 1.5) +
  scale_x_continuous(breaks = pretty(as.numeric(rev(my.data$date)), n = 5)) 
_

出力

_Error: Discrete value supplied to continuous scale
_

EricWattの提案アプリケーションを実際のコードにテストする

コード提案

_p <- ggplot(molten, aes(x = rev(Vars), y = value)) + 
    geom_bar(aes(fill=variable), stat = "identity", position="dodge") + 
    facet_wrap( ~ variable, scales="free") +
    scale_x_discrete("My dates", breaks = Dates[seq(1, length(Dates), by = 2)], labels = rev(Dates))  
_

出力

_Error: `breaks` and `labels` must have the same length 
_

scale_x_discrete("My dates", breaks = Dates[seq(1, length(Dates), by = 2)])がある場合、ラベルのないx軸が空白になります。

図1簡略化されたコード例の出力図2EricWattの最初の提案の出力

enter image description hereenter image description here

OS:Debian 9
R:3.4.0

これは、単純化した例で機能します。 molten data.frameがないと、より複雑なプロットと照合するのは困難です。

ggplot(data = my.data, aes(date, vals)) + 
  geom_line(size = 1.5) +
  scale_x_date(breaks = my.data$date[seq(1, length(my.data$date), by = 2)])

基本的に、scale_x_dateを使用します。これにより、奇妙な日付から数値への変換が処理される可能性があります。

5
Eric Watt

私の解決策は、最終的には他のリンクされたスレッドとEricWattの答えによって動機付けられた実際のコードにあります

# Test data of actual data here # https://stackoverflow.com/q/45130082/54964

ggplot(data = molten, aes(x = as.Date(Time.data, format = "%d.%m.%Y"), y = value)) + 
  geom_bar(aes(fill = variable), stat = "identity", position = "dodge") +
  facet_wrap( ~ variable, scales="free") +
  theme_bw() + # has to be before axis text manipulations because disables their effect otherwise
  theme(axis.text.x = element_text(angle = 90, hjust=1), 
        text = element_text(size=10)) +
  scale_x_date(date_breaks = "2 days", date_labels = "%d.%m.%Y")