Nano Hash - криптовалюты, майнинг, программирование

Как разделить легенду в ggplot2

введите здесь описание изображения У меня есть график, на котором есть прямоугольные диаграммы (geom_boxplot), наложенные на некоторые маркерные точки (geom_point). По умолчанию легенда отображается вместе, но я хотел бы разделить ее, чтобы каждый элемент geom_point был указан отдельно в легенде.

library(tidyverse)  # data manipulation etc
library(scales)     # for log scales
library(viridis)    # for colour-blind friendly palettes

PlotData_HIL %>%
  ggplot(aes(Analyte, Concentration, fill = Analyte)) +                                  # Plot analyte vs Concentration, with a different colpour per analyte
  geom_boxplot(outlier.shape = NA, varwidth = TRUE, alpha = 0.7, colour = "grey40")+     # Boxplot with circles for outliers and width proportional to count
  scale_y_log10(breaks = major_spacing, minor_breaks = minor_spacing, labels = number) + # Log scale for Y axis
  geom_jitter(aes(fill = Analyte), shape = 21, size = 2.5, alpha = 0.3, width = 0.1)+                          # overlay data points to show actual distribution and clustering
  geom_point(aes(Analyte,GIL_fresh), colour="red", shape=6, size = 3)+                                 # Choose the HIL set to apply
  geom_point(aes(Analyte,ADWG), colour="red", shape=4, size = 3)+
  geom_point(aes(Analyte,HSLAB_sand_2-4), colour="red", shape=3, size = 3)+
  labs(title = "Box Plots", subtitle = "Box width is proportional to the square root of the number of samples.  Individual data points overlaid as circles.\nGILs shown as red triangless.ADWG values shown as red Xs. HSLs shown as red +s.") +
  ylab("Concentration (\u03BCg/L)") +                                                        # Label for Y axis
  xlab("") +                                                                             # X axis already done
  scale_color_viridis(discrete = TRUE, option = "viridis")+                              # Colour-blind friendly outlines
  scale_fill_viridis(discrete = TRUE, option ="viridis") +                               # Colour-blind friendly fill
  theme_bw()+
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5), panel.grid.major.y = element_line(size = 0.5))+
  theme(strip.background = element_rect(colour = "black", fill = "white"),               # White label strips, black text and border
        strip.text.x = element_text(colour = "black", face = "bold"),
        panel.border = element_rect(colour = "black", fill = NA),
        axis.title = element_text(colour = "black", face = "bold"),
        axis.text = element_text(colour = "black", face = "bold")
  )

Легенда показывает для каждого аналита запись для каждой функции geom_ * в вызове ggplot, наложенную друг на друга. Я хотел бы отделить их, чтобы запись легенды для geom_boxplot отличалась от записи легенды для каждой из записей geom_point, чтобы я мог обозначить, что означает треугольник, и что означает X.

Я читаю данные из электронной таблицы и не знаю, как настроить фиктивные данные в коде, но образцы данных находятся здесь:

Analyte Concentration GIL_fresh GIL_marine  ADWG HSLAB_sand_2_4 HSLAB_sand_4_8 HSLAB_sand_8 HSLC_sand_2_4 HSLC_sand_4_8 HSLC_sand_8 HSLD_sand_2_4 HSLD_sand_4_8 HSLD_sand_8 HSLAB_silt_2_4 HSLAB_silt_4_8
   <fct>           <dbl>     <dbl>      <dbl> <dbl>          <dbl>          <dbl>        <dbl> <lgl>         <lgl>         <lgl>               <dbl>         <dbl>       <dbl>          <dbl>          <dbl>
 1 Arsenic          12       13          NA      10             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
 2 Cadmium           1        0.2         0.7     2             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
 3 Chromi…          24        1           4.4    50             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
 4 Copper           42        1.4         1.3  2000             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
 5 Lead             24        3.4         4.4    10             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
 6 Mercury           0.1      0.06        0.1     1             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
 7 Nickel            8       11           7      20             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
 8 Zinc            100        8          15      NA             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
 9 Ammonia        2252       NA          NA      NA             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
10 Arsenic          10       13          NA      10             NA             NA           NA NA            NA            NA                     NA            NA          NA             NA             NA
18.12.2020

  • Вам будет легче помочь, если вы включите простой воспроизводимый пример с образцом ввода, который можно использовать для тестирования и проверки возможных решений. 18.12.2020
  • Я кое-что добавлю 18.12.2020
  • Я обновил вопрос. Надеюсь, более полезно 18.12.2020
  • Я думаю, вам нужно будет немного развернуть данные, чтобы вы могли использовать сопоставление aes(shape = ), а затем добавить scale_shape_manual. Нам будет сложно показать вам это на самом деле, потому что вы предоставили очень мало данных, а также не предоставили копии major_spacing и minor_spacing. 18.12.2020

Ответы:


1

Я пытаюсь создать некоторые данные, подобные вашим, я подозреваю, что столбцы с формами, такими как GIL_fresh, скорее всего, были получены в результате какого-то слияния. Может быть, лучше построить их с отдельным data.frame:

analytes = c("Ammonia", "Arsenic", "Cadmium", "Chromium", "Copper", "Lead", "Mercury", "Nickel", "Zinc")
PlotData_HIL = data.frame(
                Analyte = rep(analytes,each=5),
                Concentration = runif(45,0,100),
                GIL_fresh  = rep(c(10,rep(NA,8)),5),
                ADWG = rep(c(15,rep(NA,8)),5))

Для красных точек вам нужно указать shape= внутри aes(..), чтобы появилась легенда для формы, и, наконец, я убрал точки для легенды заливки, потому что она выглядит довольно избыточной:

PlotData_HIL %>%
ggplot(aes(Analyte, Concentration, fill = Analyte)) +                                  
geom_boxplot(outlier.shape = NA, varwidth = TRUE, alpha = 0.7, colour = "grey40")+     
scale_y_log10() + 
geom_jitter(aes(fill = Analyte), shape = 21, size = 2.5, alpha = 0.3, width = 0.1)+                         
geom_point(aes(Analyte,GIL_fresh,shape="GIL_fresh"), colour="red", size = 3)+                                 
geom_point(aes(Analyte,ADWG,shape="ADWG"), colour="red", size = 3) +
scale_shape_manual(values=c(4,6))+
scale_color_viridis(discrete = TRUE, option = "viridis")+                              
scale_fill_viridis(discrete = TRUE, option ="viridis") +
guides(fill = guide_legend(override.aes = list(shape = NA) ))

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

18.12.2020
  • Потрясающий . идеально! 20.12.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..