#r #ggplot2
#r #ggplot2
Вопрос:
Я пытаюсь воспроизвести тему этого графика с помощью ggplot, я искал в Интернете статьи и вопросы, чтобы показать мне, как присвоить этим графикам правильный размер и положение, а также назначить форму плотной точки, и я нашел несколько статей, в которых обсуждалось изменение положения, я попробовал следующее:
d1<-read.csv("./data/games.csv")
p.1<-ggplot(d1, aes(x=cream_rating, y=charcoal_rating))
# Map winner on color. Add some transparency in case of overplotting
geom_point(aes(color = winner), alpha = 0.2)
# Add the cross: Add geom_pints with one variable fixed on its mean
geom_point(aes(x = mean(cream_rating), color = winner), alpha = 0.2)
geom_point(aes(y = mean(charcoal_rating), color = winner), alpha = 0.2)
scale_shape_manual(values=c(16, 17))
# "draw"s should be dropped and removed from the title
scale_color_manual(values = c(cream = "seagreen4", charcoal = "chocolate3", draw = NA))
ggtitle("Rating of Cream vs Charcoal")
xlab("rating of cream") ylab("rating of charcoal") theme_classic() theme(plot.title = element_text(hjust = 0.5))
Я попробовал следующее, чтобы разместить их вместе:
require(gridExtra)
plot.1<-p.1
plot.2<-ggExtra::ggMarginal(p.1, type = "histogram")
grid.arrange(plot.1, plot.2, ncol=3)
library(cowplot)
theme_set(theme_cowplot())
plot.1<-p.1
plot.2<-ggExtra::ggMarginal(p.1, type = "histogram")
plot_grid(plot.1, plot.2, labels = "AUTO")
cowplot::plot_grid(plot.1, plot.2, labels = "AUTO")
library(magrittr)
library(multipanelfigure)
figure1 <- multi_panel_figure(columns = 2, rows = 1, panel_label_type = "none")
# show the layout
figure1
figure1 %<>%
fill_panel(plot.1, column = 1, row = 1) %<>%
fill_panel(plot.2, column = 2, row = 1) %<>%
figure1
Это моя структура набора данных:
structure(list(rated = c(FALSE, TRUE, TRUE, TRUE, TRUE, FALSE,
TRUE, FALSE, TRUE, TRUE), turns = c(13L, 16L, 61L, 61L, 95L,
5L, 33L, 9L, 66L, 119L), victory_status = structure(c(3L, 4L,
2L, 2L, 2L, 1L, 4L, 4L, 4L, 2L), .Label = c("draw", "mate", "outoftime",
"resign"), class = "factor"), winner = structure(c(2L, 1L, 2L,
2L, 2L, 3L, 2L, 1L, 1L, 2L), .Label = c("charcoal", "cream",
"draw"), class = "factor"), increment_code = structure(c(3L,
7L, 7L, 5L, 6L, 1L, 1L, 4L, 2L, 1L), .Label = c("10 0", "15 0",
"15 2", "15 30", "20 0", "30 3", "5 10"), class = "factor"),
cream_rating = c(1500L, 1322L, 1496L, 1439L, 1523L, 1250L,
1520L, 1413L, 1439L, 1381L), charcoal_rating = c(1191L, 1261L,
1500L, 1454L, 1469L, 1002L, 1423L, 2108L, 1392L, 1209L)), row.names = c(NA,
10L), class = "data.frame")
Я попробовал предложение Стефана (которое очень помогло) с некоторыми изменениями:
d1<-read.csv("./data/games.csv")
ggplot(d1, aes(x=cream_rating, y=charcoal_rating))
##### Map winner on color. Add some transparency in case of overplotting
geom_point(aes(color = winner), alpha = 0.2)
##### Add the cross: Add geom_pints with one variable fixed on its mean
geom_point(aes(x = mean(cream_rating), color = winner), alpha = 0.2)
geom_point(aes(y = mean(charcoal_rating), color = winner), alpha = 0.2)
scale_shape_manual(values=c(16, 17))
##### "draw"s should be dropped and removed from the title
scale_color_manual(values = c(cream = "seagreen4", charcoal = "chocolate3", draw = NA))
ggtitle("Rating of Cream vs Charcoal")
xlab("rating of cream") ylab("rating of charcoal") theme_bw() theme(plot.title = element_text(hjust = 0.5))
Я хочу отфильтровать «рисование» из графика, также, когда я меняю точечные фигуры на треугольники и круги, они, похоже, не меняются, кроме того, я получаю эту ошибку:
Warning message:
“Removed 950 rows containing missing values (geom_point).”
Warning message:
“Removed 950 rows containing missing values (geom_point).”
Warning message:
“Removed 950 rows containing missing values (geom_point).”
Еще одна вещь, которую я заметил, я получаю двойной крест вместо одного!
Когда я пробую первый блок кода в этом вопросе, я получаю длинные искаженные фигуры, а не квадратные рядом друг с другом.
Ответ №1:
Возможно, это соответствует вашим потребностям. Чтобы склеить три графика вместе, я использую cowplot
пакет. Легенда, вероятно, все еще не идеальна.
-
Чтобы получить только одну легенду, но при этом обеспечить хорошее выравнивание графиков, я сделал легенды для первого и третьего графика «прозрачными»
guide_legend
для просмотра иtheme
опций -
Чтобы сделать все графики одинакового размера, я добавил прозрачные поля на точечный график
-
Чтобы исправить положение и сделать графики квадратными, я установил одинаковые ограничения для обеих осей с помощью
xlim
иylim
и установил соотношение сторон равным 1 с помощьюtheme()
library(ggplot2)
library(dplyr)
library(cowplot)
# Add a second draw to the example data to make the density work
d1 <- d1 %>%
add_row(winner = "draw", cream_rating = 1002, charcoal_rating = 1250)
# Get the limits
lims <- c(floor(min(d1$cream_rating, d1$charcoal_rating)), ceiling(max(d1$cream_rating, d1$charcoal_rating)))
p1 <- d1 %>%
ggplot(aes(x=cream_rating, y=charcoal_rating, color = winner, shape = winner))
geom_point(alpha = 0.2, na.rm = TRUE)
scale_color_manual(values = c(cream = "seagreen4", charcoal = "chocolate3", draw = "blue"))
scale_shape_manual(values = c(cream = 16, charcoal = 17, draw = 15))
xlim(lims)
ylim(lims)
labs(x = "rating of cream", y = "rating of charcoal")
theme_classic()
theme(plot.title = element_text(hjust = 0.5), legend.position = "bottom")
theme(aspect.ratio = 1)
p1_1 <- p1
guides(color = guide_legend(override.aes = list(color = c(NA, NA, NA))))
theme(legend.text = element_blank(), legend.title = element_blank())
p1_1 <- ggExtra::ggMarginal(p1_1, type = "histogram",
margins = 'both',
size = 5,
position = "identity",
color = NA,
fill= NA)
p2 <- ggExtra::ggMarginal(p1, type = "histogram",
margins = 'both',
size = 5,
groupColour = TRUE,
groupFill = TRUE,
position = "identity"
)
# Make legend transparent
p1 <- p1
guides(color = guide_legend(override.aes = list(color = c(NA, NA, NA))))
theme(legend.text = element_blank(), legend.title = element_blank())
p3 <- d1 %>%
ggplot(aes(x=cream_rating, y=charcoal_rating, color = winner, shape = winner))
geom_density_2d(na.rm = TRUE)
geom_point(alpha = 0, show.legend = FALSE)
scale_color_manual(values = c(cream = "seagreen4", charcoal = "chocolate3", draw = "blue"))
xlim(lims)
ylim(lims)
labs(x = "rating of cream", y = "rating of charcoal")
theme_classic()
theme(plot.title = element_text(hjust = 0.5),
legend.position = "bottom")
theme(aspect.ratio = 1)
# Make legend transparent
p3 <- p3
guides(color = guide_legend(override.aes = list(color = c(NA, NA, NA))))
theme(legend.text = element_blank(), legend.title = element_blank())
p3 <- ggExtra::ggMarginal(p3, d1, type = "density",
margins = 'both',
size = 5,
groupColour = TRUE,
groupFill = TRUE,
position = "identity"
)
plot_row <- plot_grid(p1_1, p2, p3, nrow = 1)
# now add the title
title <- ggdraw()
draw_label(
"Rating of Cream vs Charcoal",
fontface = 'bold',
x = 0,
hjust = 0
)
final <- plot_grid(
title, plot_row,
ncol = 1,
# rel_heights values control vertical title margins
rel_heights = c(0.1, 1)
)
final
Примечание. В зависимости от ширины и высоты вашего устройства печати, исправление соотношения сторон добавляет некоторое пустое пространство сверху и снизу. В зависимости от вашего конечного результата вам, вероятно, придется немного поиграть с шириной и высотой (и масштабом), например, используя
ggsave("final.png", width = 18, height = 6, units = "cm", scale = 1.5)
дает
Комментарии:
1. Это сработало хорошо, но участок вытянут, а не квадраты! , как это исправить, также как я могу добавить обратно «рисовать» к сюжету, я устал удалять фильтр, но он не добавил «рисовать», я хотел повторить его форму и цвет, яне знал, что он включен, пока не увидел надпись внизу, где показано «победитель, уголь, крем, ничья», с розовой формой круга для угля, светло-зеленым треугольником для крема и светло-зеленым квадратом для ничьей.
2. Привет @user432797. Я только что внес правку. Добавление рисунка было простым. Просто удалите фильтр и добавьте некоторые формы и цвета для рисунков. Сложная часть заключалась в том, чтобы сделать графики квадратными. С этой целью я переключился на cowplot. Но вам, вероятно, все равно придется немного поиграть с параметрами, чтобы улучшить окончательный вид.
3. Большое вам спасибо @stefan, я ценю вашу поддержку. Это было полезно, я смог добиться тех же результатов, используя
par(mfrow = c(3, 1)) nf <- layout(matrix(c(1,2,3),nrow=1), widths=c(2,2,2), heights=c(2,1,1), TRUE)
4. но ваш код, @stefan, более сложный и чистый, чем моя строка, еще раз большое спасибо за помощь, это было действительно полезно для понимания как синтаксиса, так и потока кода.