简体   繁体   中英

Merging ggplot2 legend

I'm having trouble merging a ggplot2 legend that assigns color and shape based on different variables. One variable assigns the shape, whereas another assigns the color. However, the legend is split into two (one with the shape, one with the colors) is there a simple way to merge the two?

Sample Data:

       ID   EFFRENT      SQFT Layers FLOORPLAN
1   10496  3369.196  817.9767   1 BR     1_1_0
2   10496  4635.274 1242.8750    2BR     2_2_0
3   10496  5621.419 1656.6250    3BR     3_3_0
4   10752  2180.625  775.0000   1 BR     1_1_0
5   10752  2744.991 1100.8620    2BR     2_2_0
6   11127  2335.705  692.0893   1 BR     1_1_0
7   11127  2730.000  659.0000    2BR     2_1_0
8   11127  3272.705  860.2480    2BR     2_2_0
9   11127  4832.667 1253.0000    3BR     3_2_0
10   1163  2540.833  700.0000   1 BR     1_1_0
11   1163  2734.767  820.0000   1 BR   1_1_0_D
12   1163  2981.783  854.0000   1 BR   1_1_0_L
13   1163  2987.167  963.0000    2BR     2_2_0
14   1163  3193.043 1292.0000    2BR   2_2_0_L

ggplot code:

    Z <- ggplot(dataset, aes(x=SQFT,y=EFFRENT)) +  geom_point() 

# Number of unique floorplans and colorramp
a <-  length(factor(levels(dataset$FLOORPLAN)))
clr <- c("#814d35","#576df7","#1b9e13","#e166eb","#01dc82","#d13fc1","#9dd755","#7b2ca2","#dcc821","#0277e3","#bcb900","#c982ff","#7edb71","#9d0088","#01a055","#e70082","#009763","#ef274a","#02c0fc","#da5601","#0c9bff","#c59000","#554698","#dac751","#9a0f77","#9b8400","#ff95ee","#4c5804","#dbafff","#b55300","#aebaff","#e6402a","#00886b","#ff4874","#38958a","#ff643a","#b0d094","#af0058","#dfc38d","#89306c","#946100","#ff67a8","#8a3b19","#ffa3cb","#b3003e","#8b628e","#ff665f","#80413e","#ff9886","#ff99a4")

#Add Shapes and Color
Z2 <-   Z + aes(shape = factor(dataset$Layers)) + 
     geom_point(aes(colour = factor(dataset$FLOORPLAN)),  size = 6) + scale_colour_manual( name="Floorplan",  values=clr) 


#Modify Axis Titles
Z3 <-Z2 + theme(axis.title.x = element_text(face="bold", colour="#000000", size=20),
           axis.text.x  = element_text(angle=90, vjust=0.5, size=16)) + theme(axis.title.y = element_text(face="bold", colour="#000000", size=20),
           axis.text.y  = element_text(angle=90, vjust=0.5, size=16))   +  labs(x="Square Footage", y="Effective Rent")

This yields a legend like so:

传说

Where I'm hoping to get all of the floor plans in one entry, with their respective color and shape (all 0_* the same shape, all 1_* the same shape, etc)

I know this shouldn't be hard but I can't seem to find a solution

The solution is to collapse the levels in the FLOORPLAN variable of your dataset . The fct_collapse function from the forcats package easily does this, but this is a lot to write so I'm only putting the first couple of rows to get you on your way.

library(forcats)
dataset$FLOORPLAN <- factor(dataset$FLOORPLAN) %>%
                     fct_collapse(0_* = c("0_1_0", "0_1_0_D", etc.),
                                  1_* = c("1_1_0", "1_1_0_D", etc.),
                                  etc...)

Your clr vector of colours will need to be amended accordingly, since there would be only 4 colours to apply. I'll leave it up to you to choose which colours you want.

In regards to the chart itself, in your call of the geom_point layer, remove the factor() function call since it's already used above:

geom_point(aes(colour = FLOORPLAN),  size = 6)

The rest of your code should work as is. I'm confused as to the purpose of this line:

 a <-  length(factor(levels(dataset$FLOORPLAN)))

The a object doesn't appear to be used for anything else.

Actually, I really need a solution for this problem, but the answer given here is not helping me. I still get the same situation: a legend for shapes and another legend for sample IDs. I would like to have only 1 legend, with the right color and shape for every sample, without a separate legend for shapes enter image description here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM