Идеальное выравнивание значений плотности по оси X и geom_col - PullRequest
0 голосов
/ 04 января 2019

У меня есть график плотности и столбец (geom_col), который я хочу выровнять в соответствии со значениями оси x.

График geom_col:

#creating the data 
col_plotting <- as.data.frame(matrix(ncol = 2, nrow = 20))
col_plotting[, 1] <- seq(0.1, 1, 0.1)
col_plotting[, 2] <- c(4.914910e-03, 2.485699e-17, 7.776309e-03, 1.177328e-01,
                       9.445104e-04, 7.739012e-02, 1.529308e-01, 4.829482e-01, 
                       2.902169e+00, 7.992388e+00)

#The figure
p.col_plotting <- ggplot(col_plotting, aes(x = V1, y = V2)) +
  geom_col() +
  xlab("Scores") +
  ylab("Incidence") +
  ggtitle(label="Proportion of Incidences For Each Score") +
  theme(plot.title = element_text(size = 20),
        legend.title = element_text(face = "bold")) +
  scale_x_continuous(breaks = c(seq(0.1, 1, 0.1)), 
                     minor_breaks = NULL, 
                     labels = c(seq(0.1, 1, 0.1)), 
                     limits = NULL, 
                     position = "bottom") #setting the x axis labels

График плотности:

#the data
plotting <- as.data.frame(matrix(ncol = 2, nrow = length(sample(seq(0, 1, 0.001)))))
plotting[, 1] <- sample(seq(0, 1, 0.001))
plotting[, 2] <- c(rep("Yes", 500), rep("No", nrow(plotting)-500))

#The plot
P.plotting <- ggplot(plotting, aes(V1, colour = V2, fill = V2))+
  xlab("Scores") +
  ggtitle(label = "Density plot for Desicions") +
  theme(plot.title = element_text(size = 20),
        legend.title = element_text(face = "bold"))+
  geom_density(alpha = 0.60, size = 0.9) +
  scale_colour_manual(values = cbPalette, name = "Desicion") +
  scale_fill_manual(values = cbPalette, name = "Desicion")  

Выравнивание их вместе при использовании cowplot

plot_grid(p.col_plotting, P.plotting, 
          labels = c("A", "B"), 
          nrow = 2, align = "v", axis = "lr")

Создает эту фигуру:

enter image description here

Числа не идеально выровнены друг с другом.

Я прочитал эту ветку , которая утверждает, что проблема заключается в определении пределов х.

Но проблемазаключается в том, что когда я определяю пределы x для geom_col от 0 до 1 (как в кадре данных):

p.col_plotting <- ggplot(col_plotting, aes(x = V1, y = V2))+
  geom_col() +
  xlab("Scores") +
  ylab("Incidence") +
  ggtitle(label = "Proportion of Incidences For Each Score") +
  theme(plot.title = element_text(size = 20),
        legend.title = element_text(face = "bold")) +
  scale_x_continuous(breaks = c(seq(0.1, 1, 0.1)), 
                     minor_breaks = NULL, 
                     labels = c(seq(0.1, 1, 0.1)), 
                     limits = NULL, 
                     position = "bottom") +
  xlim(0, 1)

я получаю предупреждение:

Предупреждающее сообщение: удалены 2 строки, содержащие пропущенные значения (geom_col).

И график получается так:

enter image description here

Я подумал, что было бы лучше просто определить пределы x как для графика col, так и для графика плотности, равного (0, 1.1), но хотя график geom_col выглядит хорошо, плотностьВ зависимости от значения графика на оси x между значениями по оси х от 1 до 1,1, даже если эти значения не существуют в исходных данных графика:

enter image description here

Кроме того, выравнивание все еще не является идеальным, после того, как я установил предельные значения x.

Далее я также попробовал два других решения:

Этот код выдал ошибку при попытке использовать rbind для 2 переменных с неодинаковыми размерами

g2 <- ggplotGrob(p.col_plotting )
g3 <- ggplotGrob(P.plotting)
g <- rbind(g2, g3, size = "first")
g$widths <- grid::unit.pmax(g2$widths, g3$widths)
grid::grid.newpage()
grid::grid.draw(g)

Этот код создает ту же невыровненную сетку

g1 <- ggplotGrob(p.col_plotting)
g2 <- ggplotGrob(P.plotting)
colnames(g1) <- paste0(seq_len(ncol(g1)))
colnames(g2) <- paste0(seq_len(ncol(g2)))
x11()
grid::grid.draw(gridExtra::gtable_combine(g2, g1, along=2))

Что еще я могу сделать?Спасибо!

1 Ответ

0 голосов
/ 04 января 2019

Используйте coord_cartesian(xlim = c(min, max)).Он устанавливает пределы без сброса данных:

library(ggplot2)
library(cowplot)

# Color-blind friendly colors
# (you forgot to add this variable)
cbPalette <- c("#999999", "#E69F00", "#56B4E9", "#009E73", 
               "#F0E442", "#0072B2", "#D55E00", "#CC79A7")


# Plot 1
p.col_plotting <- ggplot(col_plotting, aes(x = V1, y = V2)) +
    geom_col() +
    labs(title = "Proportion of Incidences for Each Score",
         x = "Scores", 
         y = "Incidence") +
    theme(plot.title = element_text(size = 20),
          legend.title = element_text(face = "bold")) +
    scale_x_continuous(breaks = c(seq(0, 1, 0.1))) +
    coord_cartesian(xlim = c(seq(0, 1, 0.1)))

# Plot 2
p.plotting <- ggplot(plotting, aes(V1, colour = V2, fill = V2)) +
    labs(title = "Density Plot for Decisions", 
         x = "Scores",
         y = "Density") +
    theme(plot.title = element_text(size = 20),
          legend.title = element_text(face = "bold")) +
    geom_density(alpha = 0.60, size = 0.9) +
    scale_colour_manual(values = cbPalette, name = "Decision") +
    scale_fill_manual(values = cbPalette, name = "Decision")


# Plot Grid
plot_grid(p.col_plotting, p.plotting, labels = c("A", "B"), 
          nrow = 2, align = "v", axis = "lr")

1

edit : я также взял на себя смелость очистить ваш коднемного (упростить звонки, убрать опечатки).

...