强制R停止绘制缩写的轴标签(科学计数法)-例如1e + 00

178
在ggplot2中,我如何阻止轴标签被缩写 - 例如,在绘制时沿着x轴显示1e + 00,1e + 01?理想情况下,我希望强制R显示实际值,即在此情况下为1,10。任何帮助将不胜感激。
10个回答

212

我想你正在寻找这个:

require(ggplot2)
df <- data.frame(x=seq(1, 1e9, length.out=100), y=sample(100))
# displays x-axis in scientific notation
p  <- ggplot(data = df, aes(x=x, y=y)) + geom_line() + geom_point()
p

# displays as you require
library(scales)
p + scale_x_continuous(labels = label_comma())

2
这个有效。谢谢。顺便问一下,在使用scales包的ggplot2中,还有哪些其他“标签”选项可用于轴? - JPD
3
请访问 ggplot2.org 网站上的这个页面,它对我解决类似问题很有帮助。 - Marta Karas
3
那个链接已经过时了。现在你需要查看 https://ggplot2-book.org/scale-position.html#label-functions - scales::commascales::label_comma 的简写,等等。 - tjebo
2
嗯,我只是在尝试这个,但是出现了一个新的错误:错误:中断和标签长度不同 - Joshua Eric Turcotte
1
这对我没有用,直到我看到了这个评论……基本上说你需要先运行 library(scales) - George Hayward
显示剩余3条评论

95

你尝试过类似以下的内容吗:

options(scipen=10000)

绘图之前?


8
通过设置更高的“惩罚”,以决定是否使用科学计数法。有关详细解释,请参见此答案:https://dev59.com/mnbZa4cB1Zd3GeqPFm6q#18600721 - ecoe

62

就@Arun的最新消息更新一下,因为我今天尝试了一下,但它没有起作用,因为它已被实现到了

+ scale_x_continuous(labels = scales::comma)

4
@Arun的答案应该可以直接使用,也许您忘记包含require(scales)了?这会导入包含“逗号”刻度的软件包。正如您已经发现的那样,您还可以在引用软件包时指定它,而不必事先要求它。 - cincodenada

26

作为一种更通用的解决方案,您可以使用 scales::format_format 来移除科学计数法。这还可以让您对标签的准确显示方式拥有更多的控制,而不像 scales::comma 只能在数量级之间进行逗号分隔。

例如:

require(ggplot2)
require(scales)
df <- data.frame(x=seq(1, 1e9, length.out=100), y=sample(100))

# Here we define spaces as the big separator
point <- format_format(big.mark = " ", decimal.mark = ",", scientific = FALSE)

# Plot it
p  <- ggplot(data = df, aes(x=x, y=y)) + geom_line() + geom_point()
p + scale_x_continuous(labels = point)

4
目前format_format是从scales包中重试得来的。您应该改用label_number()或label_date()。 - SJ9

21

有一种方法不需要使用scales库。

你可以尝试以下操作:

# To deactivate scientific notation on y-axis:

    p + scale_y_continuous(labels = function(x) format(x, scientific = FALSE))

# To activate scientific notation on y-axis:

    p + scale_y_continuous(labels = function(x) format(x, scientific = TRUE))

# To deactivate scientific notation on x-axis:

    p + scale_x_continuous(labels = function(x) format(x, scientific = FALSE))

# To activate scientific notation on x-axis:

    p + scale_x_continuous(labels = function(x) format(x, scientific = TRUE))

9
将原始问题扩展到包括分数,即1、0.1、0.01、0.001等,并避免尾随零。
p + scale_x_continuous(labels = function(x) sprintf("%g", x))

3
从审美角度来看,这要好得多! - Ollie Perkins
这也可以在不影响log10比例的情况下工作,并且同意它具有更美观的外观。 - Markm0705

5
如果你想使用逗号作为千位分隔符,可以使用以下方法:

p + scale_x_continuous(labels=function(x) format(x, big.mark = ",", scientific = FALSE))

这个操作没有影响到我的log10比例尺。 - Markm0705

2
p + scale_x_continuous(labels = scales::number_format(accuracy = 1))

accuracy = 1 表示整数的精度,如果你想要一位小数,可以使用 accuracy = 0.1 ,如果需要两位小数,可以使用accuracy = 0.01,以此类推。

类似于这个答案


1
这个问题的最简单通用解决方案是将 R 用于科学计数法的罚款设置得更高,即将 scipen() 设置为您感到舒适的数字。例如,如果您的图表坐标轴最大值可能达到 100000,设置 scipen(200000) 将确保 R(和 ggplot)对所有低于 200000 的数字使用标准表示法,并且不需要向 ggplot 函数添加任何行。

2
请注意,这是一个非常基本的示例,它不考虑错误处理或最佳实践。在实际应用程序中,请务必考虑这些因素。首先,您需要使用Python内置的socket模块创建一个服务器套接字。然后,您可以使用该套接字侦听传入连接并接受客户端连接。一旦建立连接,您可以从客户端接收数据并将其发送回客户端。以下是一个简单的Python服务器示例:import socket # 创建服务器套接字 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定服务器地址和端口 server_socket.bind(('localhost', 8080)) # 开始监听传入连接 server_socket.listen() print('Server listening on port 8080...') while True: # 接受客户端连接 client_socket, address = server_socket.accept() print(f'Accepted connection from {address}') # 接收客户端数据 data = client_socket.recv(1024) print(f'Received data from client: {data.decode()}') # 发送响应给客户端 response = 'Hello from the server!' client_socket.send(response.encode()) # 关闭客户端套接字 client_socket.close()要测试此服务器,请运行上面的代码并使用telnet或类似工具连接到localhost:8080。您应该能够看到服务器打印出已接受连接并从客户端接收数据。 - tjebo

-1
library(scales)

ggplot(data, aes(salary)) +
  geom_histogram() +
  scale_x_continuous(labels = comma)

在这里,scale_x_continuous(labels = comma) 可以解决这个问题。


虽然这段代码片段可能是解决方案,但包括详细的解释真正有助于提高您发布内容的质量。请记住,您正在回答未来读者的问题,而这些人可能不知道您代码建议的原因。 - Shawn Hemelstrand

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接