Как инвертировать ось y на участке
Я хотел бы знать, как сделать график в R, где ось y инвертирована таким образом, что отображаемые данные появляются в том, что будет четвертым квадрантом (IV) декартовой плоскости, в отличие от первого (I) квадранта.
Для справки, сюжет, который я пытаюсь сделать, выглядит очень похоже на следующее (источник):
![a plot with inverted y-axis]()
Я нашел несколько вопросов в Интернете, связанных с обращением нумерации по оси Y, но все они все еще строят данные в первом квадранте. Может ли кто-нибудь предложить, как я мог бы создать сюжет, подобный показанному выше?
Ответы
Ответ 1
Просто чтобы дать отработанный ответ, следуя комментариям @timriffe и @joran...
Используйте функцию для незначительных тиков журнала из этого ответа:
minor.ticks.axis <- function(ax,n,t.ratio=0.5,mn,mx,...){
lims <- par("usr")
if(ax %in%c(1,3)) lims <- lims[1:2] else lims[3:4]
major.ticks <- pretty(lims,n=5)
if(missing(mn)) mn <- min(major.ticks)
if(missing(mx)) mx <- max(major.ticks)
major.ticks <- major.ticks[major.ticks >= mn & major.ticks <= mx]
labels <- sapply(major.ticks,function(i)
as.expression(bquote(10^ .(i)))
)
axis(ax,at=major.ticks,labels=labels,...)
n <- n+2
minors <- log10(pretty(10^major.ticks[1:2],n))-major.ticks[1]
minors <- minors[-c(1,n)]
minor.ticks = c(outer(minors,major.ticks,`+`))
minor.ticks <- minor.ticks[minor.ticks > mn & minor.ticks < mx]
axis(ax,at=minor.ticks,tcl=par("tcl")*t.ratio,labels=FALSE)
}
Сделайте некоторые воспроизводимые примеры:
x <- 1:8
y <- 10^(sort(runif(8, 1, 10), decreasing = TRUE))
График без осей:
plot(x, log10(y), # function to plot
xlab="", # suppress x labels
type = 'l', # specify line graph
xlim = c(min(x), (max(x)*1.3)), # extend axis limits to give space for text annotation
ylim = c(0, max(log10(y))), # ditto
axes = FALSE) # suppress both axes
Добавьте причудливую ось журнала и поменяйте метки меток вправо вверх (спасибо @joran!):
minor.ticks.axis(2, 9, mn=0, mx=10, las=1)
Добавьте ось x вверх:
axis(3)
Добавить метку оси x (спасибо за наконечник, @WojciechSobala)
mtext("x", side = 3, line = 2)
И добавьте аннотацию в конец строки
text(max(x), min(log10(y)), "Example", pos = 1)
Здесь результат:
![enter image description here]()
Ответ 2
Отвечая на вопрос в заголовке, лучший/самый простой способ инвертирования оси - перевернуть переменные limit
:
> plot(1:10, xlim=c(1,10));
![standard plot]()
> plot(1:10, xlim=c(10,1));
![график с инвертированной осью X]()
> plot(1:10, ylim=c(10,1));
![график с инвертированной осью Y]()
Выполнение этого способа означает, что вам не нужно возиться с осями, отличными от координат изображения.
Это можно объединить с параметром "xaxt =" n "и дополнительной командой axis
для размещения оси с другой стороны:
> plot(1:10, ylim=c(10,1), xaxt="n"); axis(3);
![Перевернутый граф с осью X сверху]()
Ответ 3
Теперь довольно легко отменить ось y, используя scale_y_reverse
и указать position = "top"
для оси x в ggplot2
Пример
library(ggplot2)
library(scales)
set.seed(99)
Date <- seq(from = as.Date("2017-12-01"), to = as.Date("2017-12-15"),
by = "days")
Flux <- runif(length(Date), 1, 10000)
Flux_df <- data.frame(Date, Flux)
p1 <- ggplot(Flux_df, aes(Date, Flux)) +
geom_col() +
xlab("") +
scale_x_date(position = "top", breaks = pretty_breaks(), expand = c(0, 0)) +
scale_y_reverse(expand = expand_scale(mult = c(0.2, 0))) +
theme_bw(base_size = 16) +
theme(panel.border = element_blank(),
panel.grid.major.x = element_blank(),
panel.grid.minor = element_blank(),
axis.line = element_line()) +
theme(legend.position = "none")
p1
![введите описание изображения здесь]()
Если мы хотим как логарифмическую, так и обратную оси, нам нужно обходное решение, предлагаемое здесь, поскольку ggplot2
не имеет этого параметра atm
reverselog_trans <- function(base = exp(1)) {
trans <- function(x) -log(x, base)
inv <- function(x) base^(-x)
scales::trans_new(paste0("reverselog-", format(base)), trans, inv,
scales::log_breaks(base = base), domain = c(1e-100, Inf))
}
p1 + scale_y_continuous(trans = reverselog_trans(10),
breaks = scales::trans_breaks("log10", function(x) 10^x),
labels = scales::trans_format("log10", scales::math_format(10^.x)),
expand = expand_scale(mult = c(0.2, 0))) +
annotation_logticks()
![введите описание изображения здесь]()