ฉันจะเปลี่ยนการจัดรูปแบบของตัวเลขบนแกนด้วย ggplot ได้อย่างไร


131

ฉันใช้ R และ ggplot เพื่อวาดรูปกระจายของข้อมูลบางอย่างทั้งหมดใช้ได้ยกเว้นว่าตัวเลขบนแกน y จะออกมาพร้อมกับการจัดรูปแบบเลขชี้กำลังของคอมพิวเตอร์เช่น 4e + 05, 5e + 05 เป็นต้นซึ่งเห็นได้ชัดว่า ยอมรับไม่ได้ดังนั้นฉันต้องการให้แสดงเป็น 500,000, 400,000 และอื่น ๆ การรับสัญกรณ์เลขชี้กำลังที่เหมาะสมก็เป็นที่ยอมรับเช่นกัน

รหัสสำหรับพล็อตมีดังนี้:

p <- ggplot(valids, aes(x=Test, y=Values)) +
  geom_point(position="jitter") +
  facet_grid(. ~ Facet) +
  scale_y_continuous(name="Fluorescent intensity/arbitrary units") +
  scale_x_discrete(name="Test repeat") +
  stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")

ความช่วยเหลือใด ๆ ที่ชื่นชมมาก


30
ระวังการอธิบายggplotตัวเลือกเริ่มต้นว่า "ยอมรับไม่ได้อย่างชัดเจน" คุณหมายความว่าคุณมีความชอบส่วนตัวสำหรับรูปแบบอื่น ตัวเลขในรูปแบบ4e+05เป็นสัญกรณ์ทางวิทยาศาสตร์และน่าจะเป็นการจัดรูปแบบที่ต้องการในแอปพลิเคชันที่หลากหลาย
Andrie

54
4e + 05 ไม่ใช่สัญกรณ์ทางวิทยาศาสตร์ แต่เป็นการประมาณโดยคอมพิวเตอร์กับสัญกรณ์ทางวิทยาศาสตร์ มันไม่เป็นที่ยอมรับในวารสารการพิมพ์ใด ๆ ที่ฉันคิดได้ดังนั้นฉันจึงคิดว่ามันไม่สามารถยอมรับได้สำหรับวิทยานิพนธ์ของฉัน
Jack Aidley

คำตอบ:


127

อีกทางเลือกหนึ่งคือการจัดรูปแบบป้ายกำกับแกนของคุณด้วยเครื่องหมายจุลภาคโดยใช้แพ็คเกจscalesและเพิ่ม

 scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)

ไปยังคำสั่ง ggplot ของคุณ

หากคุณไม่ต้องการโหลดแพ็กเกจให้ใช้:

scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)

9
น่าประหลาดใจที่ปัญหาเล็กน้อยเช่นนี้ต้องโหลดแพ็คเกจใหม่
luchonacho

FYI สิ่งนี้ใช้ได้กับ scale_y_log10 (label = scale :: comma) และฉันสมมติว่าสเกลอื่นใน ggplot2 เคล็ดลับดีๆ!
TheProletariat

66

ฉันยังพบวิธีอื่นในการทำเช่นนี้ที่ให้สัญลักษณ์ 'x10 (ตัวยก) 5' ที่เหมาะสมบนแกน ฉันโพสต์ไว้ที่นี่ด้วยความหวังว่ามันจะมีประโยชน์กับบางคน ฉันได้รับรหัสจากที่นี่ดังนั้นฉันจึงอ้างว่าไม่มีเครดิตสำหรับมันซึ่งถูกต้องไปที่ Brian Diggs

fancy_scientific <- function(l) {
     # turn in to character string in scientific notation
     l <- format(l, scientific = TRUE)
     # quote the part before the exponent to keep all the digits
     l <- gsub("^(.*)e", "'\\1'e", l)
     # turn the 'e+' into plotmath format
     l <- gsub("e", "%*%10^", l)
     # return this as an expression
     parse(text=l)
}

ซึ่งคุณสามารถใช้เป็น

ggplot(data=df, aes(x=x, y=y)) +
   geom_point() +
   scale_y_continuous(labels=fancy_scientific) 

10
หากคุณไม่ต้องการให้ 0 พิมพ์เป็น "0 x 10⁺⁰" ให้เพิ่มสิ่งต่อไปนี้ใต้format(...)บรรทัด:l <- gsub("0e\\+00","0",l)
กึ่งภายนอก

1
หากคุณต้องการเป็นกรณีพิเศษอย่างอื่นวิธีที่ง่ายที่สุดคือเพิ่มgsub()โดยตรงหลังจากนั้นในformat()ขณะที่ทดสอบสิ่งที่format()ส่งคืนสำหรับกรณีของคุณในคอนโซลแยกต่างหาก
กึ่งภายนอก

3
เพิ่มสิ่งนี้ก่อนgsubคำสั่งสุดท้าย: # remove + after exponent, if exists. E.g.: (3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l)และหลัง: # convert 1x10^ or 1.000x10^ -> 10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)เพื่อให้อยู่ในรูปแบบที่มักใช้ในเอกสาร
John_West

44
x <- rnorm(10) * 100000
y <- seq(0, 1, length = 10)
p <- qplot(x, y)
library(scales)
p + scale_x_continuous(labels = comma)

เมื่อฉันลองสิ่งนี้ฉันได้รับข้อผิดพลาดว่าฟอร์แมตเตอร์เป็นอาร์กิวเมนต์ที่ไม่ได้ใช้? มันต้องการแพ็คเกจอื่นหรืออะไร?
Jack Aidley

4
ฉันเปลี่ยนรหัสเพื่อรวมlibrary(scales)และใช้งานcommaซึ่งน่าจะทำงานได้ดีกว่าฟังก์ชันที่ฉันเคยมีมาก่อน
DiscreteCircle

16

ฉันมาเล่นเกมช้าที่นี่ แต่ในกรณีที่คนอื่นต้องการวิธีแก้ปัญหาที่ง่ายฉันได้สร้างชุดฟังก์ชันที่สามารถเรียกได้ว่า:

 ggplot + scale_x_continuous(labels = human_gbp)

ซึ่งให้ตัวเลขที่มนุษย์อ่านได้สำหรับแกน x หรือ y (หรือตัวเลขใด ๆ โดยทั่วไปจริงๆ)

คุณสามารถค้นหาฟังก์ชันได้ที่นี่: Github Repo เพียงแค่คัดลอกฟังก์ชันในสคริปต์ของคุณเพื่อให้คุณสามารถเรียกใช้งานได้


10

ฉันพบว่าคำตอบที่แนะนำของ Jack Aidley เป็นคำตอบที่มีประโยชน์

ฉันต้องการที่จะโยนตัวเลือกอื่นออกไป สมมติว่าคุณมีชุดข้อมูลที่มีตัวเลขขนาดเล็กจำนวนมากและคุณต้องการแน่ใจว่าป้ายชื่อแกนเขียนจุดทศนิยมแบบเต็ม (เช่น 5e-05 -> 0.0005) จากนั้น:

NotFancy <- function(l) {
 l <- format(l, scientific = FALSE)
 parse(text=l)
}

ggplot(data = data.frame(x = 1:100, 
                         y = seq(from=0.00005,to = 0.0000000000001,length.out=100) + runif(n=100,-0.0000005,0.0000005)), 
       aes(x=x, y=y)) +
     geom_point() +
     scale_y_continuous(labels=NotFancy) 

23
สิ่งนี้สามารถย่อให้สั้นลงได้โดยใช้ฟังก์ชันที่ไม่ระบุชื่อ: scale_y_continuous(labels=function(n){format(n, scientific = FALSE)})ทำไมไม่มีตัวจัดรูปแบบที่กำหนดไว้ล่วงหน้าเช่นนั้นนรกก็รู้
eMPee584
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.