การหมุนฉลากแกน x ใน R สำหรับ barplot


99

ฉันพยายามทำให้ป้ายแกน x หมุน 45 องศาบนบาร์พล็อตโดยไม่มีโชค นี่คือรหัสที่ฉันมีด้านล่าง:

barplot(((data1[,1] - average)/average) * 100,
        srt       = 45,
        adj       = 1,
        xpd       = TRUE,
        names.arg = data1[,2],
        col       = c("#3CA0D0"),
        main      = "Best Lift Time to Vertical Drop Ratios of North American Resorts",
        ylab      = "Normalized Difference",
        yaxt      = 'n',
        cex.names = 0.65,
        cex.lab   = 0.65)

คำตอบ:


60

คำตอบที่แก้ไขต่อคำตอบของดาวิด:

นี่เป็นวิธีแฮ็ก ฉันเดาว่ามีวิธีที่ง่ายกว่านี้ แต่คุณสามารถระงับป้ายแถบและข้อความพล็อตของป้ายกำกับได้โดยบันทึกตำแหน่งของแถบbarplotและปรับแต่งขึ้นและลงเล็กน้อย นี่คือตัวอย่างของชุดข้อมูล mtcars:

x <- barplot(table(mtcars$cyl), xaxt="n")
labs <- paste(names(table(mtcars$cyl)), "cylinders")
text(cex=1, x=x-.25, y=-1.25, labs, xpd=TRUE, srt=45)

3
ข้อแม้ : หากคุณกำลังใช้beside = TRUEคุณอาจต้องการใช้colMeans(x)แทนxหากคุณต้องการเพียงหนึ่งป้ายกำกับต่อกลุ่ม
MichaelChirico

278

ใช้พารามิเตอร์เสริม las = 2

barplot(mytable,main="Car makes",ylab="Freqency",xlab="make",las=2)

ป้อนคำอธิบายภาพที่นี่


3
ฉันเชื่อว่านี่ควรเป็นคำตอบที่ได้รับการยอมรับ ทำงานได้อย่างสมบูรณ์โดยใช้พารามิเตอร์ของฟังก์ชัน barplot พื้นฐานที่ใช้ในคำถาม
jwhaley58

1
ตกลงนี่ควรเป็นคำตอบที่ยอมรับได้ วิธีแก้ปัญหาที่รัดกุมกว่ามาก
snlan

17
ใช้พาร์ (mar = c (15,4,4,2)) เพื่อปรับระยะขอบเพื่อไม่ให้ป้ายชื่อแนวตั้งถูกครอบตัดออกจากรูป
Steven Magana-Zook

24
ฉันชอบวิธีนี้เป็นการส่วนตัว แต่ไม่ได้ตอบคำถามดั้งเดิมของ OP: ฉันพยายามทำให้ป้ายแกน x หมุน 45 องศาบนบาร์พล็อต
arpieb

1
คุณจะเห็นว่า "make" ถูกปิดทับด้วยป้ายกำกับ ต้องแก้ไขอย่างไร?
Filip Bartuzi

31

หมุนป้ายชื่อแกน x ด้วยมุมที่เท่ากันหรือเล็กกว่า 90 องศาโดยใช้กราฟิกพื้นฐาน รหัสที่ดัดแปลงมาจากคำถามที่พบบ่อย R :

par(mar = c(7, 4, 2, 2) + 0.2) #add room for the rotated labels

#use mtcars dataset to produce a barplot with qsec colum information
mtcars = mtcars[with(mtcars, order(-qsec)), ] #order mtcars data set by column "qsec"

end_point = 0.5 + nrow(mtcars) + nrow(mtcars) - 1 #this is the line which does the trick (together with barplot "space = 1" parameter)

barplot(mtcars$qsec, col = "grey50", 
        main = "",
        ylab = "mtcars - qsec", ylim = c(0,5 + max(mtcars$qsec)),
        xlab = "",
        space = 1)
#rotate 60 degrees (srt = 60)
text(seq(1.5, end_point, by = 2), par("usr")[3]-0.25, 
     srt = 60, adj = 1, xpd = TRUE,
     labels = paste(rownames(mtcars)), cex = 0.65)

ป้อนคำอธิบายภาพที่นี่


9

คุณสามารถส่ง data frame ของคุณไปยังฟังก์ชันต่อไปนี้:

rotate_x <- function(data, column_to_plot, labels_vec, rot_angle) {
    plt <- barplot(data[[column_to_plot]], col='steelblue', xaxt="n")
    text(plt, par("usr")[3], labels = labels_vec, srt = rot_angle, adj = c(1.1,1.1), xpd = TRUE, cex=0.6) 
}

การใช้งาน:

rotate_x(mtcars, 'mpg', row.names(mtcars), 45)

ป้อนคำอธิบายภาพที่นี่

คุณสามารถเปลี่ยนมุมการหมุนของฉลากได้ตามต้องการ



6

คุณสามารถใช้ ggplot2 เพื่อหมุนป้ายชื่อแกน x เพื่อเพิ่มเลเยอร์เพิ่มเติม

theme(axis.text.x = element_text(angle = 90, hjust = 1))

2

คำตอบของ Andre Silva เหมาะสำหรับฉันโดยมีข้อแม้อย่างหนึ่งในบรรทัด "barplot":

barplot(mtcars$qsec, col="grey50", 
    main="",
    ylab="mtcars - qsec", ylim=c(0,5+max(mtcars$qsec)),
    xlab = "",
    xaxt = "n", 
    space=1)

สังเกตอาร์กิวเมนต์ "xaxt" หากไม่มีฉลากจะถูกวาดสองครั้งครั้งแรกโดยไม่มีการหมุน 60 องศา


1

ในเอกสารของ Bar Plots เราสามารถอ่านเกี่ยวกับพารามิเตอร์เพิ่มเติม ( ...) ซึ่งสามารถส่งผ่านไปยังการเรียกใช้ฟังก์ชัน:

...    arguments to be passed to/from other methods. For the default method these can 
       include further arguments (such as axes, asp and main) and graphical 
       parameters (see par) which are passed to plot.window(), title() and axis.

ในเอกสารของพารามิเตอร์กราฟิก (เอกสารประกอบpar) เราสามารถดู:

las
    numeric in {0,1,2,3}; the style of axis labels.

    0:
      always parallel to the axis [default],

    1:
      always horizontal,

    2:
      always perpendicular to the axis,

    3:
      always vertical.

    Also supported by mtext. Note that string/character rotation via argument srt to par does not affect the axis labels.

นั่นคือเหตุผลที่การผ่านlas=2คือคำตอบที่ถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.