2014-11-10 3 views
29

Мне кажется, что это должно быть очевидно ... все, что я пытаюсь сделать, это удалить ось x со дна моего графика и добавить его в начало.Ввод оси x в верхней части диаграммы ggplot2

Вот пример воспроизводимости. Данные плюс код, чтобы сделать следующий график:

library(reshape2) 
library(ggplot2) 

data(mtcars) 
dat <- with(mtcars, data.frame(mpg, cyl, disp, hp, wt, gear)) 
cor.matrix <- round(cor(dat, use = "pairwise.complete.obs", method = "spearman"), digits = 2) 
diag(cor.matrix)<-NA 

cor.dat <- melt(cor.matrix) 
cor.dat <- data.frame(cor.dat) 
cor.dat <- cor.dat[complete.cases(cor.dat),] 


ggplot(cor.dat, aes(Var2, Var1, fill = value)) + 
    geom_tile(colour="gray90", size=1.5, stat="identity") + 
    geom_text(data=cor.dat, aes(Var2, Var1, label = value), color="black", size=rel(4.5)) + 
    scale_fill_gradient(low = "white", high = "dodgerblue", space = "Lab", na.value = "gray90", guide = "colourbar") + 
    scale_x_discrete(expand = c(0, 0)) + 
    scale_y_discrete(expand = c(0, 0)) + 
    xlab("") + 
    ylab("") + 
    theme(panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.border = element_rect(fill=NA,color="gray90", size=0.5, linetype="solid"), 
     axis.line = element_blank(), 
     axis.ticks = element_blank(), 
     panel.background = element_rect(fill="gray90"), 
     plot.background = element_rect(fill="gray90"), 
     legend.position = "none", 
     axis.text = element_text(color="black", size=14)) 

enter image description here

Но что я пытаюсь произвести IS-то кажется, что это должно быть очевидно (например, это очень легко сделать в базовой-R) , но мне не удалось найти то, что я ищу в ggplot2.

enter image description here

+0

Оси в ggplot не столь гибкий как в базе R. Для вашего примера вы не используете какие-либо компоненты оси, кроме меток. Я бы сказал, что лучше всего не рисовать ось, а просто использовать 'geom_text', чтобы поместить метки там, где вы хотите. – Gregor

+2

Перемещение оси X затруднено, но это возможно с помощью функций ggplot_gtable и ggplot_build. Эти функции «замышляют» ggplot, но вместо экрана делают так называемые «grob» -объекты, которые представляют визуальные элементы (поле, линия, сетка и т. Д.), Но на другом уровне, чем объекты ggplot (шкалы , темы, эстетика и т. д.). Вы можете манипулировать гвоздями по своему усмотрению, обменивать их, изменять их размер и т. Д. – MrGumble

+0

Если вы не автоматизируете это, вы можете просто хотеть, чтобы фигура затем отредактировала его после факта. Потребуется несколько секунд, чтобы переместить ось в иллюстратор или inkscape. – Minnow

ответ

38

Вы можете перемещать по оси Х этикетки на вершину, добавляя

scale_x_discrete(position = "top") 
+5

Благодаря https://github.com/thomasp85, чтобы сделать это возможным! – jalapic

-1

Единственный способ, которым я могу думать, чтобы сделать это, чтобы идти дикой природы с возможностью vjust темы для меток оси (и название оси, а также, я полагаю). Что-то вроде:.

df <- data.frame(x = 1:10, y = (1:10)^2)  # example data 

p <- ggplot(df, aes(x = x, y = y)) + geom_point() + 
    theme(
     axis.text.x = element_text(vjust = -5), 
     axis.title.x = element_text(vjust = -5)) 

vjust не работает с element_text, хотя, так что я "м застрял на перемещение оси клещей

6

Я использовал эту работу вокруг Пользовалась дублированный x- сюжета в. оси и прикреплены два вместе, то урожай. Я не очищенный код, но ниже приведен пример.

p.bot <- 
ggplot(cor.dat, aes(Var2, Var1, fill = value)) + 
    geom_tile(colour="gray90", size=1.5, stat="identity") + 
    geom_text(data=cor.dat, aes(Var2, Var1, label = value), color="black", size=rel(4.5)) + 
    scale_fill_gradient(low = "white", high = "dodgerblue", space = "Lab", na.value = "gray90", guide = "colourbar") + 
    scale_x_discrete(expand = c(0, 0)) + 
    scale_y_discrete(expand = c(0, 0)) + 
    xlab("") + 
    ylab("") + 
    theme(panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.border = element_rect(fill=NA,color="gray90", size=0.5, linetype="solid"), 
     axis.line = element_blank(), 
     axis.ticks = element_blank(), 
     panel.background = element_rect(fill="gray90"), 
     plot.background = element_rect(fill="gray90"), 
     legend.position = "none", 
     axis.text.x = element_blank(), 
     plot.margin = unit(c(1,0,0,0), "cm"), 
     axis.text.y = element_text(color="black", size=14)) 

p.top <- p.bot + theme(
    axis.text.x = element_text(color="black", size=14), 
    axis.text.y = element_text(color="gray90", size=14) 
    ) + coord_cartesian(ylim = c(0,0)) 



require(gtable) 
#Extract Grobs 
g1<-ggplotGrob(p.top) 
g2<-ggplotGrob(p.bot) 
#Bind the tables 
g<-gtable:::rbind_gtable(g1, g2, "first") 
#Remove a row between the plots 
g <- gtable_add_rows(g, unit(-1.25,"cm"), pos=nrow(g1)) 
#draw 
panels <- g$layout$t[grep("panel", g$layout$name)] 
g$heights[panels] <- lapply(c(0,2), unit, "null") 

grid.newpage() 
grid.draw(g) 

enter image description here

5

ЗАКАНЧИВАТЬ cowplot package

ggdraw(switch_axis_position(p + axis = 'x')) 
+0

Под текущей версией cowplot мне нужно было поменять запятую на запятую: ggdraw (switch_axis_position (p, axis = 'x')) –

0

см http://ggplot2.tidyverse.org/reference/sec_axis.html

scale_y_continuous(sec.axis = dup_axis()) 
+0

Подумайте о расширении своего ответа, объяснив, что делает код/​​почему он решает проблему OP и суммирует детали, доступные по ссылке, которую вы поделили. –

+0

Хотя этот фрагмент кода может быть решением, в том числе объяснение действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода –

Смежные вопросы