我想从ggplot2中的tis包中复制tisPlot的样式。我无法在ggplot2中创建限制左右y轴的线段。我附加了示例代码,显示了一个基本的tisPlot以及我在ggplot2中匹配该样式所做的工作。这里有没有人知道如何解决问题的最后一部分,即在y轴的顶部添加线段?谢谢。
library(tis)
library(tidyverse)
library(lubridate)
set.seed(5)
# make example time-series data
firstTis <- tis(cumsum(rnorm(120)), start = c(1996, 1), freq = 12)
tisPlot(firstTis)
# put example times-series data into a dataframe
df <- data_frame(
date = firstTis %>% time() %>% date_decimal() %>% date(),
firstTis = firstTis %>% as.numeric()
)
ggplot(df) +
geom_line(aes(x = date, y = firstTis)) +
theme_classic() +
theme(
axis.ticks.length = unit(- 7, "pt"),
axis.text.x = element_text(margin = margin(t = 10, b = 0, unit =
"pt")),
axis.text.y = element_text(margin = margin(r = 10, l = 0, unit = "pt"),
color = "white"),
axis.text.y.right = element_text(margin = margin(r = 0, l = 10, unit =
"pt"), color = "black")
) +
scale_y_continuous(sec.axis = dup_axis(name = "")) +
答案 0 :(得分:2)
更新了解决方案:
您可以在coord_cartesian()
中指定y轴限制,&amp;将y轴的乘法/加法展开常数设置为0.添加的段用于模拟顶部较长刻度的外观。可以使用基础包中的pretty()
动态设置中断,如果默认设置返回太多/太少中断,则在n
进行手动调整:
date.extension <- diff(range(df$date))*0.02
y.breaks <- pretty(df$firstTis, n = 4) # larger n will return more breaks
y.range <- range(y.breaks)
> date.extension
Time difference of 72.46 days
> y.breaks
[1] -10 -5 0 5 10
> y.range
[1] -10 10
简介:
p <- ggplot(df) +
# add horizontal line segments aligned to y-axis upper limit
annotate("segment", y = max(y.range), yend = max(y.range),
x = min(df$date)-date.extension,
xend = min(df$date) + date.extension) +
annotate("segment", y = max(y.range), yend = max(y.range),
x = max(df$date)-date.extension,
xend = max(df$date) + date.extension) +
geom_line(aes(x = date, y = firstTis)) +
theme_classic() +
theme(
axis.ticks.length = unit(- 7, "pt"),
axis.text.x = element_text(margin = margin(t = 10, b = 0, unit = "pt")),
axis.text.y = element_text(margin = margin(r = 10, l = 0, unit = "pt"), color = "white"),
axis.text.y.right = element_text(margin = margin(r = 0, l = 10, unit = "pt"), color = "black")
) +
scale_x_date(expand = c(0, 0)) +
scale_y_continuous(name = "",
breaks = y.breaks,
expand = c(0, 0), # no expansion beyond specified limits
sec.axis = dup_axis()) +
coord_cartesian(xlim = c(min(df$date)-date.extension,
max(df$date)+date.extension),
ylim = y.range)
p
(可选)防止顶部的线段被剪掉:
gt <- ggplotGrob(p)
gt$layout$clip[gt$layout$name=="panel"] <- "off"
grid::grid.draw(gt)
请注意,从min(df$date)
&amp;成员的任意一个方向对线段进行编码,以延长总日期范围的2%(在此示例中为约72天)。 max(df$date)
。因此,如果您的x轴范围发生剧烈变化(例如从20年到1年),它仍应有效。