ggplot2绘制加密货币蜡烛图:X轴日期离散化报错问题
解决ggplot2蜡烛图的日期轴问题
我来帮你搞定这个头疼的日期轴报错和时间格式保留问题~ 先拆解下报错原因,再给两种实用的解决方案:
为什么会报“Discrete value supplied to continuous scale”?
你之前的操作出现了矛盾:要么是把日期转成了离散的因子/字符型,却用了scale_x_date(这是给连续日期用的刻度函数);要么是反过来,把连续的时间戳当成离散值传给了x轴,却没匹配上对应的刻度设置。而且as.Date会直接丢掉时分秒,肯定满足不了你的需求,得用能保留完整时间的类型。
解决方案1:把时间转成有序因子(适合数据点不多的场景)
这种方法直接把时间戳转成离散的因子,同时保证顺序不乱,完美匹配离散轴需求:
步骤1:处理时间格式(保留时分秒)
先用lubridate包把时间列转成POSIXct类型(这是R里能存储完整时分秒的时间格式),没装的话先安装:
install.packages("lubridate") library(lubridate) library(ggplot2) library(rgdax) # 假设你的数据框叫crypto_data,时间列是timestamp crypto_data$timestamp <- ymd_hms(crypto_data$timestamp) # 自动识别年月日时分秒,格式不对可换as.POSIXct指定格式 # 转成有序因子,确保x轴顺序和时间顺序一致 crypto_data$time_discrete <- factor(crypto_data$timestamp, levels = unique(crypto_data$timestamp))
步骤2:画蜡烛图(用ggalt的geom_candlestick更便捷)
如果没装ggalt先安装,它专门提供了蜡烛图的几何对象:
install.packages("ggalt") library(ggalt) ggplot(crypto_data, aes(x = time_discrete)) + geom_candlestick(aes(open = open, high = high, low = low, close = close)) + # 旋转x轴标签避免重叠 theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "完整时间戳", y = "价格")
不想用ggalt的话,也可以用基础geom拼出蜡烛图:
ggplot(crypto_data, aes(x = time_discrete)) + # 画高低点的竖线 geom_segment(aes(xend = time_discrete, y = low, yend = high), color = "#333333") + # 画蜡烛实体(涨绿跌红) geom_rect(aes(xmin = as.integer(time_discrete) - 0.3, xmax = as.integer(time_discrete) + 0.3, ymin = pmin(open, close), ymax = pmax(open, close), fill = close > open)) + scale_fill_manual(values = c("#ff4444", "#00cc66")) + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + labs(x = "完整时间戳", y = "价格", fill = "上涨")
解决方案2:用连续时间轴+自定义刻度(适合数据点多的场景)
如果数据点太多,转因子会导致x轴标签挤成一团,这时候可以用连续的时间轴,但强制每个数据点都显示刻度,并且格式化标签显示完整时分秒:
ggplot(crypto_data, aes(x = timestamp)) + geom_candlestick(aes(open = open, high = high, low = low, close = close)) + # 自定义时间刻度:每个数据点都显示,标签格式为年月日时分秒 scale_x_datetime(breaks = crypto_data$timestamp, labels = function(x) format(x, "%Y-%m-%d %H:%M:%S")) + theme(axis.text.x = element_text(angle = 60, hjust = 1)) + labs(x = "完整时间戳", y = "价格")
这样既不会报错,又能完美保留时分秒的显示,x轴也不会乱序~
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

