Bungkus label sumbu panjang melalui labeller=label_wrap di ggplot2

Saya ingin membungkus label saya secara otomatis di ggplot2, yaitu menyisipkan jeda baris pada label panjang. Di sini tertulis cara menulis fungsi (1) untuk itu, tapi sayangnya saya tidak melakukannya tahu di mana harus meletakkan labeller=label_wrap di kode saya (2).

(1) fungsi oleh hadley

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

(2) contoh kode

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 dengan label panjang tidak dibungkus

Saya ingin membungkus beberapa label yang lebih panjang di sini.


person Til Hund    schedule 19.02.2014    source sumber
comment
mengapa Anda tidak menerapkan fungsi strwrap ke label Anda di luar ggplot2?   -  person baptiste    schedule 19.02.2014
comment
Saya baru mengenal R. Bagaimana cara menerapkan fungsi strwrap di luar?   -  person Til Hund    schedule 19.02.2014
comment
Harap sertakan contoh yang dapat direproduksi.   -  person Max Ghenis    schedule 12.08.2016


Jawaban (4)


Anda tidak memerlukan fungsi label_wrap. Sebagai gantinya gunakan fungsi str_wrap dari paket stringr.

Anda tidak menyediakan df bingkai data Anda, jadi saya membuat bingkai data sederhana, yang berisi label Anda. Kemudian, terapkan fungsi str_wrap pada label.

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

Sekarang untuk menerapkan label ke bagan ggplot: Bagan pertama menggunakan label asli; bagan kedua menggunakan label yang dimodifikasi; dan untuk bagan ketiga, labelnya diubah dalam panggilan ke 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))

masukkan deskripsi gambar di sini

person Sandy Muspratt    schedule 19.02.2014
comment
Solusi ini tampaknya sangat dekat dengan masalah saya. Namun bagaimana jika setiap tiga grafik memiliki label yang berbeda? Apakah saya harus mendefinisikan tiga fungsi berbeda (x) untuk menggunakan str_wrap? - person Til Hund; 20.02.2014
comment
Maaf, saya tidak mengerti pertanyaan Anda. Panggilan kedua ke ggplot adalah caranya. Artinya, terapkan str_wrap di luar panggilan ke ggplot. Jika Anda memiliki variabel lain yang berisi label panjang, terapkan juga str_wrap ke variabel tersebut. - person Sandy Muspratt; 20.02.2014
comment
Saya pikir kita hampir sampai, tapi saya tidak begitu mengerti bagaimana menerapkan str_wrap ke semua variabel saya, oleh karena itu grafik (sekitar 25) yang memiliki semua label berbeda (lihat lagi contoh kode di atas). - person Til Hund; 21.02.2014
comment
Ini luar biasa @SandyMuspratt. Catatan: tentukan kerangka data Anda dengan variable dan value alih-alih x dan y dan akan terlihat bahwa sintaksnya adalah scale_x_discrete(labels = function(x) str_wrap(x, width = 10)), menggunakan x dan bukan variable seperti yang saya asumsikan secara salah pada upaya pertama saya. - person PatrickT; 14.12.2014
comment
Selain itu, Anda mungkin ingin menambahkan + theme(axis.text.x = element_text(hjust=0)) untuk meratakan label ke kiri (dalam contoh Anda, 3 garis terlihat di tengah). - person PatrickT; 14.12.2014
comment
Masalah besarnya adalah str_wrap mengubah faktor menjadi karakter, sehingga urutan level faktor tersebut hilang. - person Dan Chaltiel; 20.11.2017

Paket "scales" menyertakan fungsi yang sangat mirip dengan fungsi Claude dan Leonardo: 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))
person Nicolás Velásquez    schedule 03.08.2017
comment
Keuntungannya dibandingkan dengan solusi Sandy adalah bahwa hal ini menjaga urutan faktor. - person AndrewMinCH; 15.10.2019

Berikut cara lain tanpa mengacu pada perpustakaan 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"))

dimana panggilannya:

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

melakukan pekerjaan memisahkan label secara dinamis. Hasilnya sama seperti pada jawaban pertama.

person Claude    schedule 05.08.2016

(Mudah-mudahan) meningkatkan jawaban @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))
person Leonardo Fontenelle    schedule 04.10.2016
comment
@Leonardo_Fontenelle hanya satu fungsi saja yang cukup function(x,width) - person timat; 24.11.2016