R:在带有自由Y轴的多面图上设置刻度标签限制

问题描述 投票:1回答:2

我对R和ggplot还是比较陌生,但是我已经发现我的绘图出现了一个常见问题

出于某种原因,ggplot通常决定不在y轴上显示顶部刻度线标签。我从随机的Google搜索中找到了以下图片,但它说明了我所指的问题:

enter image description here

如您从上表中看到的,其中一条线延伸到y轴顶部刻度线标签的上方。我觉得这很令人沮丧,ggplot做到这一点对我来说似乎很奇怪。我更希望图表中的所有数据都包含在最小和最大刻度标签内,而不是超出范围。

通常,这不是大问题,因为可以手动配置y轴标签。但是在这种情况下,我有两个方面,y轴上的比例设置为free_y。因此,我不能只手动设置y轴刻度标签,因为它们的两个图都需要具有不同的值。这是情节:

enter image description here

理想情况下,在左侧图上,y轴的顶部刻度标签为40,在右侧图上为6。这将确保所有数据都包含在y轴的最小值和最大值内局限性,但是由于上述刻面引入的复杂性,这说起来容易做起来难。

我是否有可能在不完全修改代码的情况下达到预期的效果?


这里是我正在使用的CSV文件的链接:https://onedrive.live.com/?authkey=%21AEeTM7phVBNGI5c&id=ACB3DC15E10D8AF1%213433&cid=ACB3DC15E10D8AF1。不幸的是,通过OneDrive共享CSV时,它们会转换为excel文件。因此,您可能必须访问这些文件并将其导出为CSV,才能使以下代码起作用:

library(ggplot2)
library(scales)
library(extrafont)
library(dplyr)
library(tidyr)

# you may also need to adjust the working directory here:
work_dir <- "D:\\OneDrive\\Documents\\Economic Data\\Historical Yields\\Eurozone"
setwd(work_dir)

germany_yields <- read.csv(file = "Germany 10-Year Yield Weekly (2007-2020).csv", stringsAsFactors = F)
germany_yields <- germany_yields[, -(3:6)]
colnames(germany_yields)[1] <- "Date"
colnames(germany_yields)[2] <- "Germany.Yield"

italy_yields <- read.csv(file = "Italy 10-Year Yield Weekly (2007-2020).csv", stringsAsFactors = F)
italy_yields <- italy_yields[, -(3:6)]
colnames(italy_yields)[1] <- "Date"
colnames(italy_yields)[2] <- "Italy.Yield"

greece_yields <- read.csv(file = "Greece 10-Year Yield Weekly (2007-2020).csv", stringsAsFactors = F)
greece_yields <- greece_yields[, -(3:6)]
colnames(greece_yields)[1] <- "Date"
colnames(greece_yields)[2] <- "Greece.Yield"

combined <- merge(merge(germany_yields, italy_yields, by = "Date", sort = F), 
                  greece_yields, by = "Date", sort = F)

combined <- na.omit(combined)
combined$Date <- as.Date(combined$Date,format = "%B %d, %Y")
combined["Italy_v_Germany.Spread"] <- combined$Italy.Yield - combined$Germany.Yield
combined["Greece_v_Germany.Spread"] <- combined$Greece.Yield - combined$Germany.Yield

fl_dates <- c(tail(combined$Date, n=1), head(combined$Date, n=1))

longcombined <- gather(combined, 
                       key="measure", 
                       value="value", 
                       c("Italy_v_Germany.Spread",
                         "Greece_v_Germany.Spread"))

ggplot(data=longcombined, aes(x = Date, y = value)) + geom_line() +

       facet_wrap(~measure, scales = "free_y") +

       geom_blank(aes(y = 0)) +

       scale_x_date(limits = fl_dates,
                    breaks = seq(as.Date("2008-01-01"), as.Date("2020-01-01"), by="2 years"),
                    expand = c(0, 0),
                    date_labels = "%Y") +

       scale_y_continuous(n.breaks = 7)
r ggplot2 axis facet-wrap
2个回答
0
投票

这里有些古怪的做法。在调用ggplot之前,创建一个两行数据帧,其中包含来自两个构面级别的每一行,并将两行中的值更改为刚好要为每个阈值设置的上限:]

hackdf <- longcombined[which(!duplicated(longcombined$measure)),]
hackdf$value <- c(6.1, 41)

现在在图上用线geom_point(data = hackdf, alpha = 0)添加一个不可见点:

enter image description here


0
投票

您是否尝试过@Uwe的答案:ggplot2 change axis limits for each individual facet panel?它不需要您编辑现有代码,只需添加facet_grid_sc层。

© www.soinside.com 2019 - 2024. All rights reserved.