web-dev-qa-db-ja.com

ggplot2のlabeller = label_wrapを介したラベルの自動ラッピング

ラベルをggplot2で自動的にラップしたいと思います。 ここ は、そのための関数の書き方(1)が書かれていますが、悲しいことに、コードのどこにlabeller=label_wrapを入れるべきかわかりません(2)。

(1)ハドリーによる機能

label_wrap <- function(variable, value) {
  lapply(strwrap(as.character(value), width=25, simplify=FALSE), 
         paste, collapse="\n")
}

(2)コード例

df = data.frame(x = c("label", "long label", "very, very long label"), 
                y = c(10, 15, 20))

ggplot(df, aes(x, y)) + geom_bar(stat="identity")

Histogram with long label not wrapped

長いラベルの一部をここにラップします。

38
Til Hund

label_wrap関数は必要ありません。代わりに、stringrパッケージのstr_wrap関数を使用してください。

dfデータフレームを提供しないため、ラベルを含む単純なデータフレームを作成します。次に、str_wrap関数をラベルに適用します。

library(ggplot2)
library(stringr)

df = data.frame(x = c("label", "long label", "very, very long label"), 
                y = c(10, 15, 20))
df

df$newx = str_wrap(df$x, width = 10)
df

次に、ラベルをggplotチャートに適用します。最初のチャートは元のラベルを使用します。 2番目のグラフは変更されたラベルを使用します。 3番目のチャートでは、ggplotの呼び出しでラベルが変更されます。

ggplot(df, aes(x, y)) + 
  xlab("") + ylab("Number of Participants") +
  geom_bar(stat = "identity") 

ggplot(df, aes(newx, y)) + 
  xlab("") + ylab("Number of Participants") +
  geom_bar(stat = "identity")

ggplot(df, aes(x, y)) + 
  xlab("") + ylab("Number of Participants") +
  geom_bar(stat = "identity") +
  scale_x_discrete(labels = function(x) str_wrap(x, width = 10))

enter image description here

118
Sandy Muspratt

「scales」パッケージには、クロードやレオナルドによく似た関数wrap_formatが含まれています。

library(scales)
ggplot(df, aes(x, y)) + geom_bar(stat = "identity") + 
    labs(x = "", y = "Number of Participants") + 
    scale_x_discrete(labels = wrap_format(10))
15

ライブラリstringrを参照しない別の方法を次に示します。

ggplot(df, aes(x, y)) + 
  xlab("") + ylab("Number of Participants") +
  geom_bar(stat = "identity") +
  scale_x_discrete(labels = function(x) lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n"))

ここで呼び出し:

lapply(strwrap(x, width = 10, simplify = FALSE), paste, collapse="\n")

ラベルを動的に分割する作業を行います。結果は最初の answer と同じです。

13
Claude

(願わくば)@Claudeの答えを改善する:

get_wraper <- function(width) {
    function(x) {
        lapply(strwrap(x, width = width, simplify = FALSE), paste, collapse="\n")
    }
}

ggplot(df, aes(x, y)) + geom_bar(stat = "identity") + 
    labs(x = "", y = "Number of Participants") + 
    scale_x_discrete(labels = get_wraper(10))
1