Ruben Keane
Ruben Keane

Reputation: 1

Assign unique symbols for each group

The plot consists of a comparison between values calculated from a linear regression and their corresponding experimental values from many research papers. On ggplot, I am trying to assign unique symbols for the points from each paper (82 in total) and can only come up with 45 unique symbols that look good. Here is what I have so far:

I have a series of symbols and boarders:

symbols <- c(21, 22, 23, 24, 25, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25)
Palette <- c("#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00")
borders <- c("#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000","#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000")

and plotting the points like this:

ggplot(df_select_Si) + geom_point(aes(x = logDsi, y = predictSi,  color = ref, shape = ref, fill = ref), size = 2) +
  scale_shape_manual(values = symbols) +
  scale_fill_manual(values = Palette) +
  scale_colour_manual(values = borders)+
  geom_abline(intercept = 0, slope = 1, size=1)

'ref' refers to the reference list.

And get this error message:

Error in `palette()`:
! Insufficient values in manual scale. 82 needed but only 45 provided.
Run `rlang::last_error()` to see where the error occurred.

I can see that I don't have enough pallets and borders in my lists but is there a resource where I can manually list more? Should I go about this differently? Any help is greatly appreciated.

Upvotes: 0

Views: 58

Answers (1)

jared_mamrot
jared_mamrot

Reputation: 26215

I can't think of a way to clearly identify 82 individual data points using shapes; it can be difficult to discriminate between 10 shapes on a plot, so I think 82 is unrealistic. You could perhaps use a set a set of 41 shapes 2 times, but surely there's another option that will suit your use-case. Would labelling your points using ggrepel work?

E.g. using the built-in "iris" dataset:

library(tidyverse)

set.seed(123)

symbols <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 21, 22, 23, 24, 25, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54)
Palette <- c("#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00")
borders <- c("#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000","#000000", "#000000", "#000000","#000000", "#000000", "#FF9900", "#0ADCF2", "#136330", "#FF0000", "#600D91", "#00FF00", "#FF00CC", "#FFCC00", "#1A118E", "#136520", "#10BFBF", "#D8CB2B", "#FFFF00", "#FF9900", "#0ADCF2", "#000000", "#000000", "#000000", "#000000", "#000000")

df <- iris %>%
  slice_sample(n = 82, replace = FALSE) %>%
  mutate(individuals = factor(row_number()))

df
#>    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species individuals
#> 1           4.3         3.0          1.1         0.1     setosa           1
#> 2           5.0         3.3          1.4         0.2     setosa           2
#> 3           7.7         3.8          6.7         2.2  virginica           3
#> 4           4.4         3.2          1.3         0.2     setosa           4
#> 5           5.9         3.0          5.1         1.8  virginica           5
#> 6           6.5         3.0          5.2         2.0  virginica           6
#> 7           5.5         2.5          4.0         1.3 versicolor           7
#> 8           5.5         2.6          4.4         1.2 versicolor           8
#> 9           5.8         2.7          5.1         1.9  virginica           9
#> 10          6.1         3.0          4.6         1.4 versicolor          10
#> 11          6.3         3.4          5.6         2.4  virginica          11
#> 12          5.1         2.5          3.0         1.1 versicolor          12
#> 13          6.1         2.8          4.0         1.3 versicolor          13
#> 14          5.0         3.0          1.6         0.2     setosa          14
#> 15          4.6         3.4          1.4         0.3     setosa          15
#> 16          6.7         3.0          5.0         1.7 versicolor          16
#> 17          5.5         2.4          3.8         1.1 versicolor          17
#> 18          6.3         2.5          5.0         1.9  virginica          18
#> 19          7.1         3.0          5.9         2.1  virginica          19
#> 20          6.5         3.0          5.5         1.8  virginica          20
#> 21          6.6         3.0          4.4         1.4 versicolor          21
#> 22          5.4         3.4          1.5         0.4     setosa          22
#> 23          7.6         3.0          6.6         2.1  virginica          23
#> 24          6.7         2.5          5.8         1.8  virginica          24
#> 25          7.7         3.0          6.1         2.3  virginica          25
#> 26          4.4         2.9          1.4         0.2     setosa          26
#> 27          5.0         3.5          1.3         0.3     setosa          27
#> 28          6.1         2.8          4.7         1.2 versicolor          28
#> 29          4.6         3.6          1.0         0.2     setosa          29
#> 30          5.0         3.4          1.6         0.4     setosa          30
#> 31          5.2         2.7          3.9         1.4 versicolor          31
#> 32          6.9         3.1          4.9         1.5 versicolor          32
#> 33          7.2         3.2          6.0         1.8  virginica          33
#> 34          7.7         2.6          6.9         2.3  virginica          34
#> 35          6.9         3.2          5.7         2.3  virginica          35
#> 36          5.7         3.0          4.2         1.2 versicolor          36
#> 37          4.9         3.6          1.4         0.1     setosa          37
#> 38          5.6         3.0          4.1         1.3 versicolor          38
#> 39          5.5         4.2          1.4         0.2     setosa          39
#> 40          5.8         2.6          4.0         1.2 versicolor          40
#> 41          6.2         2.2          4.5         1.5 versicolor          41
#> 42          6.4         3.1          5.5         1.8  virginica          42
#> 43          7.2         3.0          5.8         1.6  virginica          43
#> 44          6.0         2.2          4.0         1.0 versicolor          44
#> 45          4.8         3.0          1.4         0.1     setosa          45
#> 46          5.5         2.4          3.7         1.0 versicolor          46
#> 47          5.7         2.9          4.2         1.3 versicolor          47
#> 48          6.9         3.1          5.1         2.3  virginica          48
#> 49          4.8         3.4          1.9         0.2     setosa          49
#> 50          5.7         2.5          5.0         2.0  virginica          50
#> 51          5.4         3.4          1.7         0.2     setosa          51
#> 52          6.0         2.9          4.5         1.5 versicolor          52
#> 53          6.3         2.7          4.9         1.8  virginica          53
#> 54          5.1         3.8          1.6         0.2     setosa          54
#> 55          6.8         3.2          5.9         2.3  virginica          55
#> 56          6.0         2.2          5.0         1.5  virginica          56
#> 57          5.7         4.4          1.5         0.4     setosa          57
#> 58          5.4         3.9          1.7         0.4     setosa          58
#> 59          6.2         2.8          4.8         1.8  virginica          59
#> 60          6.0         3.4          4.5         1.6 versicolor          60
#> 61          7.9         3.8          6.4         2.0  virginica          61
#> 62          4.4         3.0          1.3         0.2     setosa          62
#> 63          4.8         3.1          1.6         0.2     setosa          63
#> 64          6.3         2.8          5.1         1.5  virginica          64
#> 65          6.2         3.4          5.4         2.3  virginica          65
#> 66          6.4         2.7          5.3         1.9  virginica          66
#> 67          4.6         3.1          1.5         0.2     setosa          67
#> 68          6.1         3.0          4.9         1.8  virginica          68
#> 69          7.2         3.6          6.1         2.5  virginica          69
#> 70          5.8         2.7          5.1         1.9  virginica          70
#> 71          6.4         3.2          4.5         1.5 versicolor          71
#> 72          5.1         3.7          1.5         0.4     setosa          72
#> 73          6.4         2.8          5.6         2.1  virginica          73
#> 74          6.7         3.1          4.7         1.5 versicolor          74
#> 75          4.9         3.1          1.5         0.2     setosa          75
#> 76          5.1         3.4          1.5         0.2     setosa          76
#> 77          4.7         3.2          1.6         0.2     setosa          77
#> 78          4.8         3.4          1.6         0.2     setosa          78
#> 79          6.3         2.3          4.4         1.3 versicolor          79
#> 80          7.7         2.8          6.7         2.0  virginica          80
#> 81          6.1         2.9          4.7         1.4 versicolor          81
#> 82          6.7         3.0          5.2         2.3  virginica          82

ggplot(df, aes(x = Sepal.Width, y = Sepal.Length,
             shape = individuals)) +
  geom_point(size = 2) +
  scale_shape_manual(values = c(symbols, symbols)) +
  scale_fill_manual(values = Palette) +
  scale_colour_manual(values = borders)+
  geom_abline(intercept = 0, slope = 1, size = 1) +
  ylim(c(2, 8))
#> Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
#> ℹ Please use `linewidth` instead.


library(ggrepel)
ggplot(df, aes(x = Sepal.Width, y = Sepal.Length,
               fill = Species, label = individuals)) +
  geom_point(shape = 21, size = 2) +
  scale_fill_manual(values = Palette) +
  geom_abline(intercept = 0, slope = 1, size = 1) +
  geom_text_repel(min.segment.length = 0, max.overlaps = 50) +
  ylim(c(2, 8))

Created on 2023-02-07 with reprex v2.0.2

Upvotes: 1

Related Questions