Reputation: 1
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
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