Как добавить текстуру для заливки цветов в ggplot2?

Я сейчас пользуюсь scale_brewer() для заливки, и они выглядят красиво в цвете (на экране и через цветной принтер), но печатаются относительно равномерно, как серые при использовании черно-белого принтера. Я искал онлайн ggplot2 документации, но не видел ничего о добавлении текстур для заливки цветов. Есть ли официальный ggplot2 способ сделать это или у кого-нибудь есть взлом, который они используют? Под текстурами я подразумеваю такие вещи, как диагональные полосы, обратные диагональные полосы, точечные рисунки и т. Д., Которые будут различать цвета заливки при печати в черно-белом варианте.

5 ответов

Решение

ggplot может использовать палитры цветоводов. Некоторые из них дружественные к фотокопии. Так может быть, что-то вроде этого будет работать для вас?

ggplot(diamonds, aes(x=cut, y=price, group=cut))+
geom_boxplot(aes(fill=cut))+scale_fill_brewer(palette="OrRd")

в этом случае OrRd - это палитра, найденная на веб-странице colorbrewer: http://colorbrewer2.org/

Дружественная фотокопия. Это означает, что данная цветовая схема выдерживает черно-белое фотокопирование. Расходящиеся схемы не могут быть успешно фотокопированы. Различия в легкости следует сохранять с помощью последовательных схем.

Эй, ребята, вот крошечный хак, который решает проблему с текстурой очень просто:

ggplot2: сделать границу на одной полосе темнее, чем другие, используя R

РЕДАКТИРОВАТЬ: я наконец нашел время, чтобы привести краткий пример этого взлома, который позволяет по крайней мере 3 типа базового шаблона в ggplot2. Код:

Example.Data<- data.frame(matrix(vector(), 0, 3, dimnames=list(c(), c("Value", "Variable", "Fill"))), stringsAsFactors=F)

Example.Data[1, ] <- c(45, 'Horizontal Pattern','Horizontal Pattern' )
Example.Data[2, ] <- c(65, 'Vertical Pattern','Vertical Pattern' )
Example.Data[3, ] <- c(89, 'Mesh Pattern','Mesh Pattern' )


HighlightDataVert<-Example.Data[2, ]
HighlightHorizontal<-Example.Data[1, ]
HighlightMesh<-Example.Data[3, ]
HighlightHorizontal$Value<-as.numeric(HighlightHorizontal$Value)
Example.Data$Value<-as.numeric(Example.Data$Value)

HighlightDataVert$Value<-as.numeric(HighlightDataVert$Value)
HighlightMesh$Value<-as.numeric(HighlightMesh$Value)
HighlightHorizontal$Value<-HighlightHorizontal$Value-5
HighlightHorizontal2<-HighlightHorizontal
HighlightHorizontal2$Value<-HighlightHorizontal$Value-5
HighlightHorizontal3<-HighlightHorizontal2
HighlightHorizontal3$Value<-HighlightHorizontal2$Value-5
HighlightHorizontal4<-HighlightHorizontal3
HighlightHorizontal4$Value<-HighlightHorizontal3$Value-5
HighlightHorizontal5<-HighlightHorizontal4
HighlightHorizontal5$Value<-HighlightHorizontal4$Value-5
HighlightHorizontal6<-HighlightHorizontal5
HighlightHorizontal6$Value<-HighlightHorizontal5$Value-5
HighlightHorizontal7<-HighlightHorizontal6
HighlightHorizontal7$Value<-HighlightHorizontal6$Value-5
HighlightHorizontal8<-HighlightHorizontal7
HighlightHorizontal8$Value<-HighlightHorizontal7$Value-5

HighlightMeshHoriz<-HighlightMesh
HighlightMeshHoriz$Value<-HighlightMeshHoriz$Value-5
HighlightMeshHoriz2<-HighlightMeshHoriz
HighlightMeshHoriz2$Value<-HighlightMeshHoriz2$Value-5
HighlightMeshHoriz3<-HighlightMeshHoriz2
HighlightMeshHoriz3$Value<-HighlightMeshHoriz3$Value-5
HighlightMeshHoriz4<-HighlightMeshHoriz3
HighlightMeshHoriz4$Value<-HighlightMeshHoriz4$Value-5
HighlightMeshHoriz5<-HighlightMeshHoriz4
HighlightMeshHoriz5$Value<-HighlightMeshHoriz5$Value-5
HighlightMeshHoriz6<-HighlightMeshHoriz5
HighlightMeshHoriz6$Value<-HighlightMeshHoriz6$Value-5
HighlightMeshHoriz7<-HighlightMeshHoriz6
HighlightMeshHoriz7$Value<-HighlightMeshHoriz7$Value-5
HighlightMeshHoriz8<-HighlightMeshHoriz7
HighlightMeshHoriz8$Value<-HighlightMeshHoriz8$Value-5
HighlightMeshHoriz9<-HighlightMeshHoriz8
HighlightMeshHoriz9$Value<-HighlightMeshHoriz9$Value-5
HighlightMeshHoriz10<-HighlightMeshHoriz9
HighlightMeshHoriz10$Value<-HighlightMeshHoriz10$Value-5
HighlightMeshHoriz11<-HighlightMeshHoriz10
HighlightMeshHoriz11$Value<-HighlightMeshHoriz11$Value-5
HighlightMeshHoriz12<-HighlightMeshHoriz11
HighlightMeshHoriz12$Value<-HighlightMeshHoriz12$Value-5
HighlightMeshHoriz13<-HighlightMeshHoriz12
HighlightMeshHoriz13$Value<-HighlightMeshHoriz13$Value-5
HighlightMeshHoriz14<-HighlightMeshHoriz13
HighlightMeshHoriz14$Value<-HighlightMeshHoriz14$Value-5
HighlightMeshHoriz15<-HighlightMeshHoriz14
HighlightMeshHoriz15$Value<-HighlightMeshHoriz15$Value-5
HighlightMeshHoriz16<-HighlightMeshHoriz15
HighlightMeshHoriz16$Value<-HighlightMeshHoriz16$Value-5
HighlightMeshHoriz17<-HighlightMeshHoriz16
HighlightMeshHoriz17$Value<-HighlightMeshHoriz17$Value-5

ggplot(Example.Data, aes(x=Variable, y=Value, fill=Fill)) + theme_bw() + #facet_wrap(~Product, nrow=1)+ #Ensure theme_bw are there to create borders
  theme(legend.position = "none")+
  scale_fill_grey(start=.4)+
  #scale_y_continuous(limits = c(0, 100), breaks = (seq(0,100,by = 10)))+
  geom_bar(position=position_dodge(.9), stat="identity", colour="black", legend = FALSE)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.80)+
geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.60)+  
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.40)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.20)+
  geom_bar(data=HighlightDataVert, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.0) +
  geom_bar(data=HighlightHorizontal, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal2, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal3, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal4, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal5, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal6, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal7, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightHorizontal8, position=position_dodge(.9), stat="identity", colour="black", size=.5)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.80)+
 geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.60)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.40)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.20)+
  geom_bar(data=HighlightMesh, position=position_dodge(.9), stat="identity", colour="black", size=.5, width=0.0)+
  geom_bar(data=HighlightMeshHoriz, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
geom_bar(data=HighlightMeshHoriz2, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz3, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz4, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz5, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz6, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz7, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz8, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz9, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz10, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz11, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz12, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz13, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz14, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz15, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz16, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")+
  geom_bar(data=HighlightMeshHoriz17, position=position_dodge(.9), stat="identity", colour="black", size=.5, fill = "transparent")

Производит это:

Это не очень красиво, но это единственное решение, о котором я могу думать.

Как видно, я привожу очень простые данные. Чтобы получить вертикальные линии, я просто создаю фрейм данных, содержащий переменную, к которой я хотел добавить вертикальные линии, и многократно перерисовывал границы графика, каждый раз уменьшая ширину.

То же самое делается для горизонтальных линий, но для каждого перерисовывания необходим новый фрейм данных, где я вычел значение (в моем примере "5") из значения, связанного с интересующей переменной. Эффективно снижает высоту планки. Это неуклюже для достижения и могут быть более упорядоченные подходы, но это иллюстрирует, как это может быть достигнуто.

Сетка является комбинацией обоих. Сначала нарисуйте вертикальные линии, а затем добавьте параметр горизонтальных линий fill как fill='transparent' чтобы убедиться, что вертикальные линии не нарисованы.

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

РЕДАКТИРОВАТЬ 2:

Кроме того, могут быть добавлены диагональные узоры. Я добавил дополнительную переменную во фрейм данных:

Example.Data[4,] <- c(20, 'Diagonal Pattern','Diagonal Pattern' )

Затем я создал новый фрейм данных для хранения координат для диагональных линий:

Diag <- data.frame(
  x = c(1,1,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y = c(0,0,20,20),
  x2 = c(1.2,1.2,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y2 = c(0,0,11.5,11.5),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x3 = c(1.38,1.38,1.45,1.45), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y3 = c(0,0,3.5,3.5),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x4 = c(.8,.8,1.26,1.26), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y4 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x5 = c(.6,.6,1.07,1.07), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y5 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x6 = c(.555,.555,.88,.88), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y6 = c(6,6,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x7 = c(.555,.555,.72,.72), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y7 = c(13,13,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  x8 = c(.8,.8,1.26,1.26), # 1st 2 values dictate starting point of line. 2nd 2 dictate width. Each whole = one background grid
  y8 = c(0,0,20,20),# inner 2 values dictate height of horizontal line. Outer: vertical edge lines.
  #Variable = "Diagonal Pattern",
  Fill = "Diagonal Pattern"
  )

Оттуда я добавил geom_paths в ggplot выше, каждый из которых вызывал разные координаты и рисовал линии над нужным баром:

+geom_path(data=Diag, aes(x=x, y=y),colour = "black")+  # calls co-or for sig. line & draws
  geom_path(data=Diag, aes(x=x2, y=y2),colour = "black")+  # calls co-or for sig. line & draws
  geom_path(data=Diag, aes(x=x3, y=y3),colour = "black")+
  geom_path(data=Diag, aes(x=x4, y=y4),colour = "black")+
  geom_path(data=Diag, aes(x=x5, y=y5),colour = "black")+
  geom_path(data=Diag, aes(x=x6, y=y6),colour = "black")+
  geom_path(data=Diag, aes(x=x7, y=y7),colour = "black")

Это приводит к следующему:

Это немного неаккуратно, так как я не тратил слишком много времени на то, чтобы линии были идеально выровнены и разнесены, но это должно служить подтверждением концепции.

Очевидно, что линии могут наклоняться в противоположном направлении, и есть также место для диагональной сетки, очень похожей на горизонтальную и вертикальную сетки.

Я думаю, что это все, что я могу предложить на шаблонном фронте. Надеюсь, что кто-то может найти применение для этого.

РЕДАКТИРОВАТЬ 3: Известные последние слова. Я придумал другой вариант шаблона. На этот раз с помощью geom_jitter,

Я снова добавил еще одну переменную к фрейму данных:

Example.Data[5,] <- c(100, 'Bubble Pattern','Bubble Pattern' )

И я заказал, как я хотел, чтобы каждый образец представлен:

Example.Data$Variable = Relevel(Example.Data$Variable, ref = c("Diagonal Pattern", "Bubble Pattern","Horizontal Pattern","Mesh Pattern","Vertical Pattern"))

Затем я создал столбец, который будет содержать номер, связанный с предполагаемой целевой полосой на оси x:

Example.Data$Bubbles <- 2

Далее следуют столбцы, которые содержат позиции на оси Y "пузырей":

Example.Data$Points <- c(5, 10, 15, 20, 25)
Example.Data$Points2 <- c(30, 35, 40, 45, 50)
Example.Data$Points3 <- c(55, 60, 65, 70, 75)
Example.Data$Points4 <- c(80, 85, 90, 95, 7)
Example.Data$Points5 <- c(14, 21, 28, 35, 42)
Example.Data$Points6 <- c(49, 56, 63, 71, 78)
Example.Data$Points7 <- c(84, 91, 98, 6, 12)

Наконец я добавил geom_jitters к ggplot выше с использованием новых столбцов для позиционирования и повторного использования "точек" для изменения размера "пузырей":

+geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points3, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points4, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points2, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points5, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points6, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)+
  geom_jitter(data=Example.Data,aes(x=Bubbles, y=Points7, size=Points), alpha=.5)

Каждый раз, когда запускается график, джиттер позиционирует "пузыри" по-разному, но вот один из лучших результатов, которые у меня были:

Иногда "пузыри" будут дрожать за пределами границ. Если это произойдет, перезапустите или просто экспортируйте в больших размерах. На каждом шаге по оси Y может быть нанесено больше пузырьков, которые при желании заполнят больше пустого пространства.

Это составляет до 7 шаблонов (если вы включите противоположные наклонные диагональные линии и диагональную сетку обоих), которые можно взломать в ggplot.

Пожалуйста, не стесняйтесь предлагать больше, если кто-то может подумать о некоторых.

РЕДАКТИРОВАТЬ 4: я работал над функцией оболочки для автоматизации штриховки / шаблонов в ggplot2. Я опубликую ссылку, как только расширю функцию, чтобы разрешить шаблоны на графиках facet_grid и т. Д. Вот вывод с функцией input для простого графика баров в качестве примера:

Я добавлю последнее изменение, как только у меня будет готовая функция.

РЕДАКТИРОВАТЬ 5: Вот ссылка на функцию EggHatch, которую я написал, чтобы немного упростить процесс добавления шаблонов в графики geom_bar.

В настоящее время это невозможно, потому что grid (графическая система, которую ggplot2 использует для выполнения реального рисования) не поддерживает текстуры. Сожалею!

Вы можете использовать пакет ggtextures от Claus Wilke чтобы рисовать текстурированные прямоугольники и полосы с помощью ggplot2,

# Image/pattern randomly selected from README
path_image <- "http://www.hypergridbusiness.com/wp-content/uploads/2012/12/rocks2-256.jpg"

library(ggplot2)
# devtools::install_github("clauswilke/ggtextures")
ggplot(mtcars, aes(cyl, mpg)) + 
  ggtextures::geom_textured_bar(stat = "identity", image = path_image)

Вы также можете комбинировать его с другими гемами:

data_raw <- data.frame(x = round(rbinom(1000, 50, 0.1)))
ggplot(data_raw, aes(x)) +
  geom_textured_bar(
    aes(y = ..prop..), image = path_image
  ) +
  geom_density()

Я только что обнаружил пакет под названием ggpattern( https://github.com/coolbutuseless/ggpattern), который кажется хорошим решением этой проблемы и прекрасно интегрируется с рабочим процессом ggplot2. Хотя решения, использующие текстуры, могут хорошо работать для диагональных полос, они не будут создавать векторную графику и поэтому не являются оптимальными.

Вот пример, взятый прямо из репозитория ggpattern на github:

install.packages("remotes")
remotes::install_github("coolbutuseless/ggpattern")

library(ggplot2)
library(ggpattern)

df <- data.frame(level = c("a", "b", "c", 'd'), outcome = c(2.3, 1.9, 3.2, 1))

ggplot(df) +
  geom_col_pattern(
    aes(level, outcome, pattern_fill = level), 
    pattern = 'stripe',
    fill    = 'white',
    colour  = 'black'
  ) +
  theme_bw(18) +
  theme(legend.position = 'none') + 
  labs(
    title    = "ggpattern::geom_pattern_col()",
    subtitle = "pattern = 'stripe'"
  ) +
  coord_fixed(ratio = 1/2)

что приводит к этому сюжету:

Если бы только некоторые полосы были полосатыми, geom_col_pattern() имеет pattern_alpha аргумент, который можно использовать для полной прозрачности некоторых нежелательных полос.

ggrough может быть интересно: https://xvrdm.github.io/ggrough/

Я думаю, Docconcoct работа с Docconcoct великолепна, но теперь я неожиданно нашел специальный пакет - Patternplot. Не видел внутренний код, но виньетка кажется полезной.

Может быть полезно создать фиктивный фрейм данных, контуры которого соответствуют "текстурам", а затем использовать geom_contour. Вот мой пример:

library(ggplot2)

eg = expand.grid(R1 = seq(0,1,by=0.01), R2 = seq(0,1,by=0.01))
     eg$importance = (eg$R1+eg$R2)/2

  ggplot(eg , aes(x = R1, y = R2)) +
  geom_raster(aes(fill = importance), interpolate=TRUE) +
  scale_fill_gradient2(low="white", high="gray20", limits=c(0,1)) +
  theme_classic()+
  geom_contour(bins=5,aes(z=importance), color="black", size=0.6)+
  coord_fixed(ratio = 1, xlim=c(0,1),ylim=c(0,1))

И вот результат: затененный сюжет с линиями

(линии должны быть сглажены)

Это дополнительный вопрос к сообщению, оставленному @Docconcoct (с 5 правками).

Сравнительно небольшой воспроизводимый пример ниже показывает два подхода к сюжету, который мы хотели бы сделать. Первый использует ggplot, но не завершен. 2-й график, сгенерированный ниже, использует базовую графику R и завершен. Есть ли способ выполнить то, что показано на втором графике, используя ggplot? Я был совершенно потерян, пытаясь следовать подходу Docconcoct.

library(ggplot2)

dat <- read.table(textConnection("wrDec scen src       value
43  1850   1C  gw    39.34253
49  1850   2C  gw    87.24263
55  1850   3C  gw   133.36214
61  1850   4C  gw   189.87629
67  1850   5C  gw   234.49438
7   1850   1C  sw  -332.00033
13  1850   2C  sw  -705.26090
19  1850   3C  sw -1109.10350
25  1850   4C  sw -1538.89468
31  1850   5C  sw -1941.11464
44  1860   1C  gw   161.65695
50  1860   2C  gw   337.63655
56  1860   3C  gw   537.13948
62  1860   4C  gw   720.46927
68  1860   5C  gw   928.40398
8   1860   1C  sw  -483.56331
14  1860   2C  sw -1006.67141
20  1860   3C  sw -1584.47668
26  1860   4C  sw -2167.01980
32  1860   5C  sw -2775.84317
45  1870   1C  gw    93.09717
51  1870   2C  gw   190.74712
57  1870   3C  gw   295.68164
63  1870   4C  gw   391.21511
69  1870   5C  gw   495.22644
9   1870   1C  sw  -378.80846
15  1870   2C  sw  -785.45633
21  1870   3C  sw -1205.84678
27  1870   4C  sw -1644.12112
33  1870   5C  sw -2077.68337
46  1880   1C  gw    29.61092
52  1880   2C  gw    60.59267
58  1880   3C  gw    95.47988
64  1880   4C  gw   132.15479
70  1880   5C  gw   171.48976
10  1880   1C  sw  -210.97875
16  1880   2C  sw  -428.38672
22  1880   3C  sw  -682.01563
28  1880   4C  sw  -943.77363
34  1880   5C  sw -1213.56345
47  1890   1C  gw    12.29025
53  1890   2C  gw    24.11237
59  1890   3C  gw    36.90570
65  1890   4C  gw    50.74161
71  1890   5C  gw    66.29961
11  1890   1C  sw  -476.12546
17  1890   2C  sw  -885.65743
23  1890   3C  sw -1328.05086
29  1890   4C  sw -1782.29492
35  1890   5C  sw -2241.68459
48 1900+   1C  gw    19.06018
54 1900+   2C  gw    38.51153
60 1900+   3C  gw    60.85222
66 1900+   4C  gw    81.35425
72 1900+   5C  gw   105.22905
12 1900+   1C  sw  -264.40595
18 1900+   2C  sw  -504.66240
24 1900+   3C  sw  -808.04811
30 1900+   4C  sw -1136.96551
36 1900+   5C  sw -1539.09301"), header=TRUE)

ggplot(data=dat, aes(x=scen, y=value, fill=src)) + 
  geom_bar(stat="identity") + 
  facet_grid(~wrDec) + 
  ylab(expression(paste('Change in Average Annual Delivered Water,  ',ac%.%ft,sep='')))


# Base Graphics approach
# ----------------------
dev.new()
gwUse_chng <- matrix(subset(dat, dat$src=='gw')$value,
                       nrow = 5, ncol = 6, byrow = FALSE,
                       dimnames = list(c('1_deg', '2_deg', '3_deg', '4_deg', '5_deg'),
                                       c('1850','1860','1870','1880','1890','1900+')))

swUse_chng <- matrix(subset(dat, dat$src=='sw')$value,
                       nrow = 5, ncol = 6, byrow = FALSE,
                       dimnames = list(c('1_deg', '2_deg', '3_deg', '4_deg', '5_deg'),
                                       c('1850','1860','1870','1880','1890','1900+')))

net_chng <- swUse_chng + gwUse_chng


par(mar=c(3,6,1,0.5))
barplot(gwUse_chng, beside=TRUE, las=1, yaxt='n', yaxs='i', ylim=c(-3000, 1000), col='lightblue')
par(new=TRUE)
barplot(swUse_chng, beside=TRUE, las=1, yaxt='n', yaxs='i', ylim=c(-3000, 1000), col='mistyrose')
par(new=TRUE)
barplot(net_chng, beside=TRUE, las=1, yaxt='n', yaxs='i', ylim=c(-3000, 1000), col='black', ang=135, den=15)
legend("bottomleft", c('Groundwater','Surface-water','Net'), 
       fill=c('lightblue','mistyrose','black'), ang=c(NA,NA,135), den=c(NA,NA,25), bty='n', bg='white')
axis(side=2, at=seq(-3000,1000,by=500), labels=c('-3,000','-2,500','-2,000','-1,500','-1,000','-500','0','500','1,000'),las=1)
abline(h=0, lwd=1)
abline(v=seq(6.5, 30.5,by=6), col='grey90')
abline(h=-3000, col='black')
Другие вопросы по тегам