Положение проблемы при добавлении баров ошибок с ggplot

Вы можете выполнить интерполяцию с большинством функций CSS, включая rgba() (см. пример здесь ). Фактически, интерполяция является одной из основных особенностей пользовательских свойств.

Но вы не можете сделать это с помощью url(), поскольку url(var(--url)) анализируется не как маркер функции url(, а затем var(--url) за которым следует ), но единственный url() токен, который недействителен, поскольку var(--url) обрабатывается как сам URL, а некотируемые URL-адреса в токенах url() не могут содержать круглые скобки, если они не экранированы. Это означает, что замена никогда не возникает, потому что синтаксический анализатор никогда не видит никаких выражений var() в значении свойства - действительно, ваше объявление background полностью недействительно.

Если вы ничего не поняли , хорошо. Просто знайте, что вы не можете использовать интерполяцию var() с url() из-за унаследованных причин.

Несмотря на то, что проблема, указанная в вопросе, связана с устаревшим токеном url(), вы не можете сделать этого, создав Идентификаторы URL-адресов из нескольких var() выражений либо, если вы подумываете попробовать что-то вроде --uo: url(; --uc: ); или --uo: url("; --uc: "); и background: var(--uo) var(--url) var(--uc);. Это связано с тем, что пользовательские свойства не могут содержать непревзойденные разделители строк или части токенов url() (называемые плохими URL-адресами) .

Если вы хотите указать URL-адрес в настраиваемом свойстве, вам нужно записать все выражение url() и заменить это целое выражение:

:root {
  --url: url("https://download.unsplash.com/photo-1420708392410-3c593b80d416");
}

body {
  background: var(--url);
}

Или, чтобы выполнить интерполяцию, используйте JavaScript вместо var().

0
задан Rtist 25 March 2019 в 12:17
поделиться

1 ответ

TL; DR : С самого начала position = "dodge" (или position = position_dodge(<some width value>)) не делали то, что, как вы думали, делали.

Основная интуиция

position_dodge является одной из функций настройки положения, доступных в пакете ggplot2. Если есть несколько элементов , принадлежащих к разным группам , занимающих одно и то же место, position_identity вообще ничего не сделает, position_dodge разместит элементы рядом друг с другом горизонтально, position_stack поместил бы их друг на друга вертикально, position_fill разместил бы их друг на друге вертикально & amp; растягиваться пропорционально, чтобы соответствовать всей площади участка и т. д.

Ниже приведено краткое описание поведения различных функций регулировки положения из шпаргалки RStudio ggplot2 :

cheatsheet [1136]

[1154 ] Обратите внимание, что элементы, которые будут уклонены / и т. Д., Должны принадлежать к разным группам. Если group = <some variable> указано явно на графике, это будет использоваться в качестве переменной группировки для определения, какие элементы должны быть уклонены / и т. Д. Друг от друга. Если в aes() нет явного группового отображения, но есть одно или несколько из color = <some variable> / fill = <some variable> / linetype = <some variable> / и т. Д., Будет использовано взаимодействие всех дискретных переменных. Из ?aes_group_order:

По умолчанию группа настроена на взаимодействие всех дискретных переменных в графике. Это часто правильно разделяет данные, но если это не так, или когда на графике не используется дискретная переменная, вам нужно будет явно определить структуру группировки, сопоставив группу с переменной, имеющей различное значение для каждой группы. [ 1155]

Построение графика по графику

Начнем с вашего исходного графика. Поскольку в эстетических отображениях сюжета не было какой-либо группирующей переменной, position = "dodge" абсолютно ничего не сделал .

Мы можем заменить это на position = "identity" для обоих слоев geom (на самом деле, position = "identity" является позицией по умолчанию для geom_errorbar, так что нет необходимости прописывать ее), и результирующий график будет одинаковым. [+1157]

Увеличение прозрачности делает очевидным, что два бара занимают одно и то же место, один «позади» другого.

Думаю, этот оригинальный сюжет не , что вы на самом деле намеревались? На самом деле существует очень мало сценариев, в которых было бы целесообразно, чтобы один бар был позади другого, как этот ...

ggplot(data = df, aes(x=group1, y = mean))+
  geom_col(position = 'dodge') + 
  geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd),
                position = 'dodge') +
  ggtitle("original plot")

ggplot(data = df, aes(x=group1, y = mean))+
  geom_col(position = "identity") + 
  geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd)) +
  ggtitle("remove position dodge")

ggplot(data = df, aes(x=group1, y = mean))+
  geom_col(position = "identity", alpha = 0.5) + 
  geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd)) +
  ggtitle("increase transparency")

illustration 1

Я пропущу второй сюжет, так как добавление width = 0.2 не изменило ничего фундаментального.

На третьем графике мы наконец-то применили position = "dodge", потому что теперь есть групповая переменная. Бары и усилители Панели ошибок перемещаются соответственно в зависимости от их ширины. Это ожидаемое поведение , если вместо position = position_dodge(width = <some value>, ...) используется position = "dodge", где уклоненное расстояние по умолчанию следует ширине слоя геома, если только оно не переопределено конкретным значением в position_dodge(width = ...).

Если бы слой geom_errorbar сохранял свою ширину по умолчанию (которая равна ширине по умолчанию для geom_col), элементы обоих слоев были бы уклонены на одинаковую величину.

ggplot(data = df, aes(x=group1, y = mean, fill = group2))+
  geom_col(position = 'dodge') + 
  geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd), width = 0.2,
                position = 'dodge') +
  ggtitle("third plot")

ggplot(data = df, aes(x=group1, y = mean, fill = group2))+
  geom_col(position = 'dodge') + 
  geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd), 
                position = 'dodge') +
  ggtitle("with default width")

illustration 2

Примечание : Мы знаем geom_errorbar и amp; geom_col имеют одинаковую ширину по умолчанию, потому что они настраивают свои данные одинаковым образом. Следующая строка кода может быть найдена в GeomErrorbar$setup_data / GeomCol$setup_data:

data$width <- data$width %||% params$width %||% (resolution(data$x, FALSE) * 0.9)
# i.e. if width is specified as one of the aesthetic mappings, use that;
#      else if width is specified in the geom layer's parameters, use that;
#      else, use 90% of the dataset's x-axis variable's resolution.        <- default value of 0.9

В заключение, если у вас разные эстетические группы, указание ширины в position_dodge определяет расстояние, которое перемещает каждый элемент, при этом указав ширину в каждом слое geom определяет каждый элемент ... ну, ширина. Пока разные слои геомов уклоняются от одинакового количества, они будут выровнены друг с другом.

Ниже приведен случайный пример для иллюстрации, в котором используются разные значения ширины для каждого слоя (0,5 для geom_col, 0,9 для geom_errorbar), но одинаковая ширина уклонения (0,6):

ggplot(data = df, aes(x=group1, y = mean, fill = group2))+
  geom_col(position = position_dodge(0.6), width = 0.5) + 
  geom_errorbar(aes(ymin = mean - sd, ymax = mean + sd), width = 0.9,
                position = position_dodge(0.6)) +
  ggtitle("another example")
[1168 ] [1 149] [1 149] [1 168]
0
ответ дан Z.Lin 25 March 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: