r - 如何生成一个 (Y) 轴的 ggplot Log10 比例图?

标签 r ggplot2

我有一组数据想要制作对数刻度图,我希望图形的 Y 轴为 log10 刻度,X 轴为正常时间序列。

我已经尝试了在互联网上和这个网站上找到的各种图表的各种方法,但它们似乎都没有按照我想要的方式工作,要么给出一个空图表,要么不显示轴(只是label),或者甚至给出一个空的 png 文件。

library(ggplot2)
library(MASS)
library(scales)

# assume everything happens in GMT timezone
Sys.setenv( TZ = "GMT" )
# replicating the data: a measurement result sampled at 1 sec interval
t <- seq(start, end, by = "1 sec")
Time24 <- trimws(strftime(t, format = "%k:%M:%OS", tz="GMT"))
Date <- strftime(t, format = "%d/%m/%Y", tz="GMT")
head(Time24)
head(Date)
d <- data.frame(Date, Time24)
d$temp <- rnorm(length(d$Date),mean=25,sd=5)
head(d)
# the resulting data is as follows
#        Date  Time24     temp
#1 22/05/2019 0:00:00 22.67185
#2 22/05/2019 0:00:01 19.91123
#3 22/05/2019 0:00:02 19.57393
#4 22/05/2019 0:00:03 15.37280
#5 22/05/2019 0:00:04 31.76683
#6 22/05/2019 0:00:05 26.75153


# combining the the date and the time column of the data
t <- as.POSIXct(paste(d$Date,d$Time24,sep=" "), format = "%d/%m/%Y %H:%M:%OS", tz="GMT")

# Log Scale Method 1
png(filename = "Method 1.png", width = 800, height = 600, units = "px", pointsize = 22 )
ggplot(df,aes(x=t,y=Temp)) + geom_line() +
  scale_x_datetime(name="Time",date_breaks = "2 hour",
                   date_labels = "%H:%M\n%d-%b") +

  # Log Scale transformation code 1
  scale_y_continuous(trans = "log10") +

  labs(title="Method 1", y="Temperature (C)") +
  theme(plot.title = element_text(hjust = 0.5, size = 20),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.x = element_text(size=14),
        axis.text.y = element_text(size=14))

# Log Scale Method 2
png(filename = "Method 2.png", width = 800, height = 600, units = "px", pointsize = 22 )

# Log Scale transformation code 2
ggplot(df,aes(x=t,y=Temp), log10="y") + geom_line() +

  scale_x_datetime(name="Time",date_breaks = "2 hour",
                   date_labels = "%H:%M\n%d-%b") +
  labs(title="Method 2", y="Temperature (C)") +
  theme(plot.title = element_text(hjust = 0.5, size = 20),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.x = element_text(size=14),
        axis.text.y = element_text(size=14))

# Log Scale Method 3
png(filename = "Method 3.png", width = 800, height = 600, units = "px", pointsize = 22 )
ggplot(df,aes(x=t,y=Temp)) + geom_line() +
  scale_x_datetime(name="Time",date_breaks = "2 hour",
                   date_labels = "%H:%M\n%d-%b") +

  # Log Scale tranfsormation code 3
  scale_y_log10(breaks = trans_breaks("log10", function(x) 10^x),
                labels = trans_format("log10", math_format(10^.x))) +

  labs(title="Method 3", y="Temperature (C)") +
  theme(plot.title = element_text(hjust = 0.5, size = 20),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.x = element_text(size=14),
        axis.text.y = element_text(size=14))

# Log Scale Method 4
png(filename = "Methpd 4.png", width = 800, height = 600, units = "px", pointsize = 22 )
ggplot(df,aes(x=t,y=Temp)) + geom_line() +
  scale_x_datetime(name="Time",date_breaks = "2 hour",
                   date_labels = "%H:%M\n%d-%b") +

  # Log Scale transformation code 4
  scale_y_continuous(formatter='log10')

  labs(title="Method 4", y="Temperature (C)") +
  theme(plot.title = element_text(hjust = 0.5, size = 20),
        axis.title.x = element_text(size = 18),
        axis.title.y = element_text(size = 18),
        axis.text.x = element_text(size=14),
        axis.text.y = element_text(size=14))



quit()

我希望 Y 轴显示 log10 的缩放比例和刻度标签,如下所示:

Expected Outcome

但是我通过尝试过的各种方法产生了这些结果:

Result of the first method

Result of the second method

Result of the third method

Result of the fourth method

代码的第一部分只是我的数据集的占位符,我知道我无法以 csv 的形式在此处发布,而且我不知道如何发布我的代码并使其成为完美的可重现结果,我对 R 非常陌生,尤其是 ggplot2,对于任何错误和缺点,我深表歉意,提前致谢。

最佳答案

tl;dr您的数据范围(大约 23-27)太小,无法有效使用对数刻度。您可以手动设置中断(请参阅下面的方法#2),在这种情况下,看起来 ggplot 不尊重您对对数刻度轴的请求,而是考虑线性刻度和对数刻度之间的差异在此数据范围内几乎无法区分。

设置数据:

set.seed(101)
dd <- data.frame(x=seq.Date(as.Date("2019-01-01"),as.Date("2019-01-31"), by="1 day"), 
   y = runif(31,min=23,max=27))
dd2 <- transform(dd,y=c(25,runif(29,min=23,max=27),27000))

方法一:无轴刻度,同上

library(ggplot2)
(gg1 <- ggplot(dd,aes(x,y))+geom_point()+scale_x_date()+scale_y_log10())
gg1 %+% dd2

方法2:手动指定轴中断(与方法2基本相同)

(gg2 <- ggplot(dd,aes(x,y))+geom_point()+scale_x_date()+scale_y_log10(breaks=23:27))
gg2 %+% dd2 + scale_y_log10(breaks=c(23,100,5000,27000))

关于r - 如何生成一个 (Y) 轴的 ggplot Log10 比例图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56730945/

相关文章:

r - 有没有办法让 "findpeaks"函数在大型数据集上运行得更快?

r - 使用 geom_text,将 ggplot 中标签的长度微移一半

r - 在 ggtern 中绘制 kde 结果

r - 有没有一种简单的方法可以反转 geom() 内 aes() 内的比例顺序?

R:将 df 中列表的第一个元素提取到新的简化 df 中

r - 在 R 中将栅格保存为 USGS DEM 格式

R构造文档术语矩阵如何匹配其值由空格分隔的短语组成的字典

r - 堆积条形图ggplot2中的标签顺序

在 ggplot2 中旋转图例键

r - 突出显示热图中的单元格