2

Q. ggplot2 ファセット プロットで、大きさが異なる 3 つの異なる変数のうち 1 つだけが表示されるのを防ぐにはどうすればよいですか?

次のファセット プロットを作成しました。

ここに画像の説明を入力

ご覧のとおり、y 軸にプロットされた値は変数ごとに大きく異なりますが、 を使用scales = "free"するとその問題が解決されます。

スケールを制限するか、0 未満の値を 0 に設定して、「profit_margin」ファセット (下部の青色) で 0 未満の値を抑制したいのですが、これを達成する方法がわかりません。データ フレームの値を直接ザッピングすることもできますが、データはそのままにしておくことをお勧めします。scale_y_continuous() で関数を使用しようとしましたが、うまくいきませんでした。

上記のプロットを生成するために使用されるコードは次のとおりです。

require(lubridate)
require(reshape2)
require(ggplot2)
require(scales)

## Create dummy time series data
set.seed(12345)
monthsback <- 12
startdate <- as.Date(paste(year(now()),month(now()),"1",sep = "-")) - months(monthsback)
mydf <- data.frame(mydate = seq(as.Date(startdate), by = "month", length.out = monthsback),
                   sales = runif(monthsback, min = 600, max = 800),
                   profit = runif(monthsback, min = -50, max = 80))
## Add calculation based on data
mydf$profit_margin <- mydf$profit/mydf$sales

## Reshape...
mymelt <- melt(mydf, id = c('mydate'))

## Plot
p <- ggplot(data = mymelt, aes(x = mydate, y = value, fill = variable)) +
     geom_bar(stat = "identity") +
     facet_wrap( ~ variable, ncol = 1, scales = "free")

print(p)

そして、これは関数を使用して lapply を使用してゼロ未満の値をゼロに設定しようとした私の試みでした:

require(lubridate)
require(reshape2)
require(ggplot2)
require(scales)

## Create dummy time series data
set.seed(12345)
monthsback <- 12
startdate <- as.Date(paste(year(now()),month(now()),"1",sep = "-")) - months(monthsback)
mydf <- data.frame(mydate = seq(as.Date(startdate), by = "month", length.out = monthsback),
                   sales = runif(monthsback, min = 600, max = 800),
                   profit = runif(monthsback, min = -50, max = 80))
## Add calculation based on data
mydf$profit_margin <- mydf$profit/mydf$sales

## Reshape...
mymelt <- melt(mydf, id = c('mydate'))

scales_function <- function(myvar, myvalue){
    mycount <- 1
    newval <- lapply(myvalue, function(myarg) {
        myarg <- ifelse(myvar[mycount] == "profit_margin", ifelse(myarg < 0, 0, myarg), myarg)
    }
                  )
    return(newval)
}

## Plot
p <- ggplot(data = mymelt, aes(x = mydate, y = value, fill = variable)) +
     geom_bar(stat = "identity") +
     facet_wrap( ~ variable, ncol = 1, scales = "free") +
     scale_y_continuous(breaks = scales_function(mymelt$variable, mymelt$value))

print(p)
4

1 に答える 1

5

データをそのままにしておくことができますが、サブセットをプロットするだけです。

ggplot(data = subset(mymelt,!((variable == 'profit_margin') & value < 0)), 
       aes(x = mydate, y = value, fill = variable)) +
     geom_bar(stat = "identity") +
     facet_wrap( ~ variable, ncol = 1, scales = "free")

または、呼び出し内で置き換えます

ggplot(data = mymelt, aes(x = mydate, y = replace(value, (variable == 'profit_margin') & value <0, NA), fill = variable)) +
 geom_bar(stat = "identity") +
 facet_wrap( ~ variable, ncol = 1, scales = "free") +
 ylab('value')
于 2012-05-30T02:24:36.270 に答える