ggplot2 | Настройте geom_point только для одной переменной - PullRequest
0 голосов
/ 10 июля 2020

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

Цель:

  1. разрешить geom_point только value1 и остальные переменные будут пунктирными линиями.
  2. Value1 должно представлять точку в легенде вместо пробела.
library(ggplot2)
library(tidyverse)
library(reshape2)

#Creating a dataframe with use-case specific variables. 
df = data.frame(
                Year = 2006:2025,

                Value1 = c(40.5, 39.0, NA, NA, NA, NA, 29.9, NA, NA, NA, 21.6,
                             NA, NA, NA, NA, NA, NA, NA, NA, NA),

                Value2 = c(NA, NA, NA, NA, NA, NA, 29.9, NA, NA, NA, NA,
                             NA, NA, NA, NA, NA, NA, NA, NA, 14.9),

                Value3 = c(NA, NA, NA, NA, NA, NA, 29.9, NA, NA, NA, NA,
                             NA, NA, NA, NA, NA, NA, NA, NA, 13.0),

                Value4 = c(NA, NA, NA, NA, NA, NA, 29.9, 27.6, 25.4, 23.4, 21.6,
                             19.9, 18.4, 16.9, 15.6, 14.4, 13.3, NA, 12.2, 11.3)
                  )

#Transforming data
df <- melt(df,id.vars = "Year")

#Creating a line plot (Year vs. other variables)
ggplot(df[!is.na(df$value),], aes(x=factor(Year), y=value, group=variable)) +
  geom_line(aes(linetype=variable, color=variable, size=variable), na.rm = TRUE )+
  geom_point(na.rm = TRUE)+
  scale_linetype_manual(values=c("blank","dashed","dashed","dashed"))+
  scale_color_manual(values=c('#999999','orange2','turquoise2','blue2'))+
  scale_size_manual(values=c(0, 1.5, 1.5, 1.5))+
  theme(legend.position="top")+
  
scale_y_continuous(
breaks=seq(0,100, 10), labels = seq(0, 100, 10), limits=c(0,70),
sec.axis = sec_axis(
  name='measure (%)', trans='identity',
  breaks=seq(0,100,10), labels=seq(0,100,10))) +
  
theme(
legend.position = 'bottom', legend.direction = 'horizontal',
panel.grid.major.y = element_line(color='gray85'),
axis.title = element_text(face='bold')) +
  
labs(
x='Year', y='measure (%)')

 Created on 2020-07-10 by the reprex package (v0.3.0)

 code contributors: chemdork123, pradeepvaranasi

График вывода:

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

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

Любые предложения будут полезны.

1 Ответ

1 голос
/ 10 июля 2020

Вы можете определить данные для geom_point отдельно, чтобы они содержали только значение1. Это то, что вы хотите?

ggplot(df[!is.na(df$value),], aes(x=factor(Year), y=value, group=variable)) +
  geom_line(aes(linetype=variable, color=variable, size=variable), na.rm = TRUE )+
  geom_point(data = df[!is.na(df$value) & df$variable == "Value1",], aes(color = variable), na.rm = TRUE) +
  scale_linetype_manual(values=c("blank","dashed","dashed","dashed"))+
  scale_color_manual(values=c('#999999','orange2','turquoise2','blue2'))+
  scale_size_manual(values=c(0, 1.5, 1.5, 1.5))+
  theme(legend.position="top")+
  
  scale_y_continuous(
    breaks=seq(0,100, 10), labels = seq(0, 100, 10), limits=c(0,70),
    sec.axis = sec_axis(
      name='measure (%)', trans='identity',
      breaks=seq(0,100,10), labels=seq(0,100,10))) +
  
  theme(
    legend.position = 'bottom', legend.direction = 'horizontal',
    panel.grid.major.y = element_line(color='gray85'),
    axis.title = element_text(face='bold')) +
  
  labs(x='Year', y='measure (%)')

enter image description here

Edit: I edited the plot so the size of the points can be defined directly (and they are removed from the legend for the values with lines):

ggplot(data = NULL, aes(x=factor(Year), y=value, group=variable)) +
  geom_line(data = df[!is.na(df$value) & df$variable != "Value1",],
            aes(linetype=variable, color = variable), size = 1.5, linetype = "dashed")+
  geom_point(data = df[!is.na(df$value) & df$variable == "Value1",], 
             aes(color = variable), size = 4) +
  scale_color_manual(values=c('#999999', 'orange2','turquoise2','blue2'))+
  guides(color = guide_legend(override.aes = list(linetype = c("blank", "dashed", "dashed", "dashed"),
                                                  shape = c(16, NA, NA, NA)))) +
  scale_y_continuous(
    breaks=seq(0,100, 10), labels = seq(0, 100, 10), limits=c(0,70),
    sec.axis = dup_axis()) +
  theme(
    legend.position = 'bottom', legend.direction = 'horizontal',
    panel.grid.major.y = element_line(color='gray85'),
    axis.title = element_text(face='bold')) +
  
  labs(x='Year', y='measure (%)')

участок с измененным размером пункта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...