R: Установка границ меток тиков на граненом графике со свободной осью Y - PullRequest
1 голос
/ 30 апреля 2020

Я относительно новичок в 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. К сожалению, при совместном использовании CSV через OneDrive они преобразуются в файлы 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)

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Вот немного хакерский способ сделать это. Прежде чем вызывать ggplot, создайте фрейм данных из двух строк, содержащий по одной строке каждого из двух уровней фасетирования, и измените значения в двух строках чуть выше верхнего порога, который вы хотите установить для каждого:

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

Теперь добавьте график невидимой точки на каждом графике с линией geom_point(data = hackdf, alpha = 0):

enter image description here

0 голосов
/ 30 апреля 2020

Пробовали ли вы @ ответ Уве по адресу: ggplot2 изменить пределы оси для каждой отдельной панели фасетов ? Это не потребует от вас редактирования существующего кода, просто добавьте слой facet_grid_sc.

Он выполнил работу за меня.

Вот поведение по умолчанию (адаптировано из ответа @ Uwe здесь):

devtools::install_github("zeehio/facetscales")
library(facetscales)
library(ggplot2)

#default behaviour

ggplot(mpg, aes(displ, cty)) + 
  geom_point() + 
  facet_grid(drv~.)

Теперь, когда ось Y фасета должна редактироваться отдельно, добавьте:

scales_y <- list(
  `4` = scale_y_continuous(limits = c(5, 25), breaks = seq(5, 25, 5)),
  `f` = scale_y_continuous(limits = c(0, 40), breaks = seq(0, 40, 10)),
  `r` = scale_y_continuous(limits = c(10, 20), breaks = seq(10, 20, 2))
)

# y-axis tick labels edited in individual facets

ggplot(mpg, aes(displ, cty)) + 
  geom_point() +
  facet_grid_sc(rows = vars(drv), 
                scales = list(y = scales_y))

Вы можете добавить нужные метки тиков, отредактировав как ограничения, так и разрывы. в scale_y_continuous.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...