Quero traçar a participação de três variáveis de cada ponto geográfico.
Achei que isso seria fácil de fazer com valores RGB e consegui fazer simplesmente assim:
data <- data.frame(
Variable = c("Point1", "Point2", "Point3"),
R = c(0.4, 0.6, 0.3),
G = c(0.3, 0.2, 0.4),
B = c(0.3, 0.2, 0.3),
x = c(1, 2, 4),
y = c(5, 6, 7)
)
color_plot <- rgb(data$R, data$G, data$B)
ggplot() +
geom_point(data = data, aes(x = x, y = y, color = color_plot))
O problema é que os valores de cor são discretos, tornando a legenda que o ggplot produz inútil. Existe uma maneira elegante de adicionar uma escala de cor significativa (contínua) a este gráfico? Idealmente, os nomes de R, G e B estariam na escala.
Uma escala de cores contínua normalmente mostra o valor de uma variável, por exemplo, de baixo para alto, você pode ver azul -> branco -> vermelho em um gradiente contínuo.
Você parece descrever a plotagem de pontos x/y, mas colorindo por graus variados de 3 variáveis, R, G e B.
Essa pode ser uma direção completamente diferente, mas eu queria tentar. Seus valores R, G, B que você forneceu somam 1, então parece que você está traçando algum tipo de proporção.
Aqui estão seus dados, com pontos coloridos por seus valores RGB (com a estratégia que Jon forneceu nos comentários). Adicionei alguns rótulos mais longos na legenda e rotulei os pontos.
Os gráficos ternários são feitos para mostrar proporções/razões relativas entre 3 variáveis diferentes. Podemos plotar seus 3 valores RGB no gráfico ternário para ver em qual cor eles caem. Este gráfico servirá como uma espécie de escala contínua.
Gere uma grade de cores para o fundo do gráfico ternário, porque você só plota pontos em um gráfico ternário que têm todos a mesma soma (pensando em proporções), nós filtramos para ter apenas linhas somando o mesmo valor. Eu divido por 100 abaixo para tornar as escalas coerentes com o gráfico #1 e coloco tudo no intervalo de 0 a 1.
Usando o
ggtern
pacote, colocamos as variáveis RGB como nossas 3 estéticas. Também rotulamos os pontos do nosso dataframe anterior. Você pode ignorar os avisos sobre estéticas desconhecidas z, isso acontece frequentemente com essas extensões ggplot.Agora, juntando-os com
patchwork
. O texto do eixo dos 3 lados parece desaparecer dessa forma, infelizmente, e adiciona alguns outros rótulos que eu removo comlabs
abaixo. Mas você entendeu a ideia.Editar
Agora juntando-os com um grob de legenda personalizado, como sugerido por @allan-cameron. (crédito pelo cálculo de altura também). C̶o̶n̶v̶e̶r̶t̶i̶n̶g̶ t̶o̶ g̶r̶o̶b̶ l̶o̶s̶e̶s̶ a̶ f̶e̶w̶ e̶l̶e̶m̶e̶n̶t̶s̶ o̶f̶e̶ g̶g̶t̶e̶r̶n̶ p̶l̶o̶t̶, b̶u̶t̶ i̶t̶ s̶u̶f̶f̶i̶c̶e̶s̶. Muito mais elegante dessa forma do que usar patchwork para juntá-los. Os rótulos no gráfico ternário ficaram pequenos aqui, então eu os removi.
Edição 2 :
ggplot2::ggplotGrob()
é muito melhor converter objetos ggplot2 em grobs de forma confiável, alterado aqui.Como os valores das três variáveis somam um, você pode usar um RGB ternário como sua legenda. Embora isso funcione tecnicamente, é muito difícil para o visualizador fazer referência cruzada das cores e, na realidade, eu provavelmente usaria um método diferente, dependendo de quantos pontos você tem no gráfico.
Entretanto, se você tiver um RGB ternário como um grob chamado
my_legend
, você pode adicioná-lo como uma legenda personalizada ao seu gráfico assim:A parte difícil é criar
my_legend
. Você pode fazer isso usandoggtern
ou criar um do zero, como eu fiz aqui:Posso estar entendendo mal sua pergunta, mas acho que isso é tudo que você precisa:
ggplot(data = data, aes(x = x, y = y, color = Variable)) + geom_point() + scale_color_manual(values = color_plot)