как я могу контролировать ширину geom_errorbar по размеру символа?

В приведенном ниже примере у меня есть простой график средних значений с планками ошибок стандартного отклонения для осей X и Y. Я хотел бы контролировать ширину полосы ошибок, чтобы обе оси всегда отображали одинаковый размер.

В идеале я хотел бы, чтобы ширина/высота полосы были того же размера, что и символы (т.е. в данном случае cex = 3), независимо от окончательных размеров графика. Есть ли способ сделать это?

# Load required packages:
library(ggplot2)
library(plyr)

# Create dataset:
DF <- data.frame(
  group = rep(c("a", "b", "c", "d"),each=10),
  Ydata = c(seq(1,10,1),seq(5,50,5),seq(20,11,-1),seq(0.3,3,0.3)),
  Xdata = c(seq(1,10,1),seq(5,50,5),seq(20,11,-1),seq(0.3,3,0.3)))

# Summarise data:
subDF <- ddply(DF, .(group), summarise, 
                X = mean(Xdata), Y = mean(Ydata), 
                X_sd = sd(Xdata, na.rm = T), Y_sd = sd(Ydata))

# Plot data with error bars:
ggplot(subDF, aes(x = X, y = Y)) +
  geom_errorbar(aes(x = X, 
                ymin = (Y-Y_sd), 
                ymax = (Y+Y_sd)), 
                width = 1, size = 0.5) +
  geom_errorbarh(aes(x = X, 
                    xmin = (X-X_sd), 
                    xmax = (X+X_sd)), 
                height = 1, size = 0.5) +
  geom_point(cex = 3)  

Выглядит нормально при масштабировании 1:1 (500x500): Plot1

но ширина/высота полосы ошибок выглядят по-другому при построении с разрешением 600x200 Plot2


person Jordan    schedule 07.11.2017    source источник


Ответы (2)


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

geom_size <- 3

# Plot data with error bars:
ggplot(subDF, aes(x = X, y = Y)) +
  geom_errorbar(aes(x = X, 
                    ymin = (Y-Y_sd), 
                    ymax = (Y+Y_sd)), 
                width = 1, size = geom_size) +
  geom_errorbarh(aes(x = X, 
                     xmin = (X-X_sd), 
                     xmax = (X+X_sd)), 
                 height = 1, size = geom_size) +
  geom_point(cex = geom_size)

введите здесь описание изображения

person brettljausn    schedule 07.11.2017
comment
Я думаю, вы неправильно прочитали мой вопрос. ваш ответ хорошо контролирует «размер» (т.е. ширину линии). Я хочу контролировать ширину/высоту столбцов. - person Jordan; 07.11.2017
comment
О, так вы имеете в виду длину погрешностей? и вы хотите, чтобы они были одинаковой длины? - person brettljausn; 07.11.2017
comment
Нет, длина планок погрешностей является стандартным отклонением и определяется ymin и ymax. Я хочу контролировать «ширину» в geom_errorbar и «высоту» в geom_errorbarh - person Jordan; 07.11.2017
comment
ах, теперь я понял, вы хотите, чтобы концы полосы были того же размера, что и ваши точки данных - person brettljausn; 07.11.2017

Это просто основано на более раннем ответе Бреттляусна. Вы также можете контролировать соотношение вашего графика с помощью переменной. Это будет работать только в том случае, если вы действительно сохраните файл с ggsave(), а не в режиме предварительного просмотра. Я также использовал size для управления размером точки. Он масштабировался лучше с концами полосы ошибок.

plotheight = 100
plotratio = 3
geomsize = 3 

plot = ggplot(subDF, aes(x = X, y = Y)) +
  geom_errorbar(aes(x = X, 
                    ymin = (Y-Y_sd), 
                    ymax = (Y+Y_sd)), 
                width = .5 * geomsize / plotratio, size = 0.5) +
  geom_errorbarh(aes(x = X, 
                     xmin = (X-X_sd), 
                     xmax = (X+X_sd)), 
                 height = .5 * geomsize, size = 0.5) +
  geom_point(size = geomsize)  

ggsave(filename = "~/Desktop/plot.png", plot = plot, 
       width = plotheight * plotratio, height = plotheight, units = "mm")

Измените plotheight, plotratio и geomsize на то, что вам нужно, чтобы оно выглядело хорошо. Вам нужно будет изменить filename в предпоследней строке, чтобы получить файл в папке по вашему выбору.

person stijn    schedule 07.11.2017
comment
Спасибо Стейн! ваш ответ дает мне полпути. кажется, проблема в том, что «ширина» выражена в несколько реальных единицах, тогда как cex не имеет единиц измерения и масштабирует размеры по умолчанию. Кажется, geom_errorbar не разрешает доступ к значениям по умолчанию? Думаю, пока придется довольствоваться методом проб и ошибок. - person Jordan; 07.11.2017