如何使用ggplot更改坐标轴上数字的格式?
如何使用ggplot更改坐标轴上数字的格式?
我正在使用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="荧光强度/任意单位") +
scale_x_discrete(name="测试重复") +
stat_summary(fun.ymin=median, fun.ymax=median, fun.y=median, geom="crossbar")
非常感谢任何帮助。
问题:如何在ggplot中更改坐标轴上数字的格式?
原因:在使用ggplot进行数据可视化时,有时需要更改坐标轴上数字的格式。默认情况下,ggplot会根据数据的范围和类型自动选择数字的格式,但有时我们需要自定义数字的格式以满足特定需求。
解决方法:以下是一种可以在坐标轴上使用正确的科学计数法表示数字的方法,可以应用于ggplot图表中。这个方法可以通过以下步骤实现:
1. 定义一个自定义函数`fancy_scientific`,该函数将数字转换为科学计数法的字符字符串表示:
fancy_scientific <- function(l) { # 将数字转换为科学计数法的字符字符串 l <- format(l, scientific = TRUE) # 引用指数之前的部分以保留所有数字 l <- gsub("^(.*)e", "'\\1'e", l) # 将'e+'转换为plotmath格式 l <- gsub("e", "%*%10^", l) # 以表达式形式返回结果 parse(text=l) }
2. 使用`fancy_scientific`函数来设置坐标轴的标签:
ggplot(data=df, aes(x=x, y=y)) + geom_point() + scale_y_continuous(labels=fancy_scientific)
3. 如果不希望将0打印为"0 x 10⁺⁰",可以在`format(...)`行的下面添加以下代码:
l <- gsub("0e\\+00","0",l)
4. 如果想要特殊处理其他情况,可以在`format()`后直接添加更多的`gsub()`命令,并在单独的控制台中测试`format()`对你的情况返回的结果。
5. 如果希望按照论文通常使用的格式进行转换,可以在最后一个`gsub`命令之前添加以下代码:
# 删除指数后面的"+",如果存在。例如:(3x10^+2 -> 3x10^2) l <- gsub("e\\+","e",l) # 将1x10^或1.000x10^转换为10^ l <- gsub("\\'1[\\.0]*\\'\\%\\*\\%", "", l)
这样,就可以在ggplot中更改坐标轴上数字的格式了。
补充问题:如何根据轴刻度函数生成ggplot2自定义文本格式?
在这个问题的答案中,还有一个补充问题,可以在stackoverflow.com/questions/63477686/…上提问。
以上就是关于如何在ggplot中更改坐标轴上数字格式的原因和解决方法的整理。
问题的出现原因是用户想要改变ggplot中坐标轴上数字的格式。为了解决这个问题,用户可以使用scales包中的函数来格式化坐标轴刻度标签,然后将其添加到ggplot语句中,示例如下:
scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = comma)
如果不想加载scales包,可以使用以下方式:
scale_y_continuous(name="Fluorescent intensity/arbitrary units", labels = scales::comma)
令人惊讶的是,这样一个微不足道的问题竟然需要加载一个新的包。
另外,这个方法也适用于其他的ggplot2中的刻度标签,例如:
scale_y_log10(labels = scales::comma)
非常感谢这些提示!
虽然回答晚了点,但是你可以将任何函数传递给labels参数,例如:
scale_x_continuous(labels = function(x) format(x, big.mark = ","))
以上是解决该问题的方法。