ggplot:如何为情节和垂直线添加多个图例?

时间:2016-06-22 13:48:37

标签: r ggplot2 legend

我创建了一个图表,显示了两组的平均值和相关的95%置信区间,如下所示。对于情节,我已经使用了不同的线型,填充物,颜色。

数据plot_band如下。

dput(plot_band)
structure(list(mean = c(0.0909296772008702, 0.0949102886382386, 
0.0989192140983566, 0.102428753920507, 0.106190021551613, 0.109834234007574, 
0.11282406874623, 0.116443987192088, 0.119646042014149, 0.122877131667032, 
0.125734341129646, 0.129194412319665, 0.131921946416482, 0.13467000293138, 
0.137801823091921, 0.140320771073742, 0.143300871011905, 0.145703574224808, 
0.148502607395268, 0.151216269559201, 0.153957673466713, 0.15642722394871, 
0.159399752204122, 0.16158535629103, 0.163992551285173, 0.166446319141126, 
0.168796463238069, 0.17130024918415, 0.17319290052143, 0.175970079857704, 
0.178037138778032, 0.180359643729028, 0.182563083353043, 0.184882067722455, 
0.186933337196788, 0.18928611634363, 0.19095095692481, 0.193552969255731, 
0.195137836881874, 0.197581990963152, 0.199824696342001, 0.201576167030431, 
0.203292777876833, 0.205785273925517, 0.207611128924057, 0.209067294675698, 
0.211624327477106, 0.213018027996152, 0.215073900329166, 0.21654896049152, 
0.218432328738047, 0.220299232072702, 0.221520169903876, 0.224082916931098, 
0.225373663731495, 0.227623092060467, 0.228971037740905, 0.230665903341562, 
0.232255049713341, 0.233816039663021, 0.236156033603955, 0.237722706454038, 
0.239326639984125, 0.241061288510212, 0.323782287073584, 0.325539303794681, 
0.326575563604555, 0.327932235745535, 0.329326904419804, 0.330270965006864, 
0.331794972975829, 0.332736401387824, 0.333736983920265, 0.334858878358806, 
0.335995344145518, 0.336884010919713, 0.337760950823761, 0.338470035342276, 
0.339694375762279, 0.340590586642847, 0.340934410282471, 0.342186505998774, 
0.342699699846757, 0.343822718137376, 0.344352069575663, 0.345191547743302, 
0.345986783878912, 0.346908459064914, 0.347636673707646, 0.3483601957891, 
0.349017016236978, 0.349393026672962, 0.350215046428817, 0.350578051082168, 
0.351357872622786, 0.351833990930714, 0.352451422717008, 0.352852417773313, 
0.353786047124291, 0.354360144310735, 0.354804607588953, 0.355216156665893, 
0.3556114518015, 0.356570758245453, 0.357097049535425, 0.357671243406622, 
0.35787930232607, 0.358500009058086, 0.359107586207553, 0.359418346394681, 
0.359923090516015, 0.360327770652831, 0.360646653761867, 0.361526704703965, 
0.361860340596181, 0.362284616802613, 0.362408547406209, 0.363068975461424, 
0.363173638916247, 0.363746165222553, 0.364318465554143, 0.364550369183249, 
0.365263491228022, 0.365588246738469, 0.366124420845147, 0.366327320718437, 
0.366730809501062, 0.367298014408034), p2.5 = c(0.00920236578162877, 
0.0111305911426958, 0.0131257550019632, 0.015586474005665, 0.017588259827762, 
0.0195835240844649, 0.021653464115484, 0.0245221378289171, 0.0263028370478539, 
0.0283125178459841, 0.030809139661692, 0.034224299031932, 0.0351514351131448, 
0.0374690177003245, 0.0401208217539481, 0.0416432632702995, 0.0436268495854353, 
0.0455924496480308, 0.0481710615607138, 0.0498487868097217, 0.052013860735697, 
0.0541864115090449, 0.0559355297931858, 0.0582185384506931, 0.0595049507852038, 
0.0617291057747846, 0.0624904066599628, 0.064090526611587, 0.0665855608482458, 
0.0681610015253132, 0.0689510143842853, 0.0714235246023074, 0.0730718365551066, 
0.0733828347805513, 0.0749772653575311, 0.0775677990166739, 0.0782434582066251, 
0.0809696065399504, 0.0800620502625316, 0.0822097262074474, 0.0837314882447324, 
0.0836800886932387, 0.0843305338836378, 0.0862036703259026, 0.0874082656018874, 
0.0881312854081838, 0.0887921830279765, 0.0892805555426737, 0.0901061351380764, 
0.0914750995958728, 0.0913838119125662, 0.0926827936869315, 0.0929511644196126, 
0.0940218350370357, 0.0944327299872979, 0.0953545299910439, 0.0948298565703383, 
0.0957001873318579, 0.0961251564147676, 0.0971098251546806, 0.0974911491380601, 
0.0986598120212823, 0.0982370236835561, 0.0987719638365328, 0.114148199394403, 
0.125138552629865, 0.133069438084806, 0.140931059768343, 0.147647282172844, 
0.155831735418124, 0.163154010787227, 0.16809087346053, 0.173413948644787, 
0.178336300631342, 0.183561163161725, 0.189552221591194, 0.192350001446747, 
0.19547327255232, 0.19824967633061, 0.202611107184988, 0.205071997319457, 
0.206232495037667, 0.208471493073236, 0.209717390943683, 0.211692880593303, 
0.213829033311537, 0.215383413348152, 0.216370831366554, 0.216980537940184, 
0.217670415960084, 0.218147500129008, 0.219104770868165, 0.220215949003459, 
0.219501167154474, 0.219635297722562, 0.220565169003312, 0.218821371303922, 
0.218910618214851, 0.219518190869959, 0.219204079206471, 0.219448334243776, 
0.219174641398391, 0.217619259716122, 0.217993716481521, 0.218343413130982, 
0.217141573568049, 0.216438618727695, 0.215672180354215, 0.214841486865522, 
0.214092486614703, 0.216084004877199, 0.213891621307228, 0.213397326450924, 
0.212530621813324, 0.212650230928244, 0.211323326285971, 0.211512467761759, 
0.209879967307571, 0.208388878793908, 0.209257043929222, 0.207665115418059, 
0.207413292377895, 0.204980142991601, 0.206053394727878, 0.205039712521127, 
0.203155679138143, 0.202289445844638, 0.201779149557556), p97.5 = c(0.240681337890249, 
0.239988615023241, 0.239222274397932, 0.23882694927308, 0.239567463457127, 
0.240035884370459, 0.239971640602537, 0.242348644629734, 0.244241554912481, 
0.246794068956881, 0.248869825514075, 0.252843804762058, 0.254595507587193, 
0.257498240756364, 0.26074636531938, 0.263991307688752, 0.268222101449506, 
0.270245299020079, 0.278955701793892, 0.280366963871541, 0.286253886155709, 
0.290942761721134, 0.29709853936211, 0.300641051539586, 0.307350564223005, 
0.314475951046524, 0.31757563389217, 0.324250050938626, 0.326645521042049, 
0.334746718583917, 0.341297900171566, 0.347056902406046, 0.352412986039391, 
0.356409285744598, 0.364329251893085, 0.36882469705109, 0.373595444661095, 
0.379308956442793, 0.388012909521406, 0.393418480355642, 0.399407258087214, 
0.403270925317011, 0.407517084163824, 0.413742327029277, 0.42089783652825, 
0.422996679448412, 0.430738094720356, 0.433915405828653, 0.438263395419797, 
0.442376801773873, 0.450664409546504, 0.453854917168461, 0.455755257192578, 
0.463879371708031, 0.470262095557133, 0.478816677993115, 0.478998770025097, 
0.485204929246363, 0.490588733478761, 0.49747652543363, 0.498792119487052, 
0.508008619470507, 0.51314092048762, 0.518568532547669, 0.579810955268174, 
0.563256045407579, 0.55093710586083, 0.541241619905278, 0.532667775608687, 
0.523824194956849, 0.518816497858615, 0.512618467188886, 0.506452368044292, 
0.501653171003674, 0.499276681561068, 0.496002704329641, 0.494256887981196, 
0.49200837587611, 0.490570113245846, 0.491077058931435, 0.487352049845066, 
0.487927727831147, 0.487928022062059, 0.488900063808496, 0.488866145012628, 
0.489808465409391, 0.491100206396406, 0.492044173457154, 0.494346147046575, 
0.494980820850837, 0.49616843086841, 0.497216550345458, 0.499201695431901, 
0.501160614633382, 0.502598288902507, 0.504203085629905, 0.50530488873578, 
0.508449115699177, 0.508914783054669, 0.51306711977087, 0.51479783743171, 
0.51648055644086, 0.518549503653961, 0.522859455223989, 0.522598786005884, 
0.52736459871623, 0.527054294078792, 0.532359397607223, 0.532643025946804, 
0.533817320437782, 0.535862852499484, 0.539613602346564, 0.54138065631686, 
0.544340213112881, 0.545596882887723, 0.549029532028693, 0.546769636775625, 
0.551728290583129, 0.552996735997194, 0.555676593069663, 0.559580922687426, 
0.561700216317917, 0.562726465369815, 0.563527127546323, 0.567715046522725, 
0.568850181180136, 0.56965258128659, 0.571847219713553), outcome = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("DLT", 
"CB"), class = "factor"), exp_X_post = c(721.595263503532, 794.40305777437, 
865.319646465533, 933.669956578678, 999.728550839186, 1062.12810757171, 
1121.92986212885, 1186.37187215809, 1246.1267376175, 1305.33376392859, 
1359.36602305224, 1421.23758898206, 1472.44041133326, 1520.62395309786, 
1584.09764621781, 1634.01654454251, 1685.34860459111, 1735.26374323406, 
1785.87871337346, 1840.42999799797, 1888.32905203148, 1937.38674685726, 
1990.74583676908, 2041.61942276328, 2083.76909363497, 2134.07414000003, 
2177.97560514382, 2227.25787768033, 2269.76501622686, 2319.50659548171, 
2360.78992430352, 2404.37623851091, 2449.36656617313, 2500.80748523146, 
2540.71467060956, 2588.5685157055, 2630.93535458068, 2675.04099554242, 
2709.53185769419, 2763.12669881888, 2807.24737149465, 2849.03542063784, 
2887.16961904492, 2927.78459960731, 2973.91123171086, 3006.0197134382, 
3056.06581532434, 3089.41001229951, 3132.29020081068, 3177.35838641843, 
3212.66669292569, 3256.19625640177, 3284.73766167032, 3330.28770837953, 
3368.28973519186, 3409.05190043795, 3449.93435443996, 3485.59367731521, 
3524.70884576068, 3557.60265444533, 3615.06476720162, 3648.55074883409, 
3688.13510762386, 3727.38208940522, 721.595263503532, 794.40305777437, 
865.319646465533, 933.669956578678, 999.728550839186, 1062.12810757171, 
1121.92986212885, 1186.37187215809, 1246.1267376175, 1305.33376392859, 
1359.36602305224, 1421.23758898206, 1472.44041133326, 1520.62395309786, 
1584.09764621781, 1634.01654454251, 1685.34860459111, 1735.26374323406, 
1785.87871337346, 1840.42999799797, 1888.32905203148, 1937.38674685726, 
1990.74583676908, 2041.61942276328, 2083.76909363497, 2134.07414000003, 
2177.97560514382, 2227.25787768033, 2269.76501622686, 2319.50659548171, 
2360.78992430352, 2404.37623851091, 2449.36656617313, 2500.80748523146, 
2540.71467060956, 2588.5685157055, 2630.93535458068, 2675.04099554242, 
2709.53185769419, 2763.12669881888, 2807.24737149465, 2849.03542063784, 
2887.16961904492, 2927.78459960731, 2973.91123171086, 3006.0197134382, 
3056.06581532434, 3089.41001229951, 3132.29020081068, 3177.35838641843, 
3212.66669292569, 3256.19625640177, 3284.73766167032, 3330.28770837953, 
3368.28973519186, 3409.05190043795, 3449.93435443996, 3485.59367731521, 
3524.70884576068, 3557.60265444533, 3615.06476720162, 3648.55074883409, 
3688.13510762386, 3727.38208940522)), .Names = c("mean", "p2.5", 
"p97.5", "outcome", "exp_X_post"), row.names = c("pi_A[1]", "pi_A[2]", 
"pi_A[3]", "pi_A[4]", "pi_A[5]", "pi_A[6]", "pi_A[7]", "pi_A[8]", 
"pi_A[9]", "pi_A[10]", "pi_A[11]", "pi_A[12]", "pi_A[13]", "pi_A[14]", 
"pi_A[15]", "pi_A[16]", "pi_A[17]", "pi_A[18]", "pi_A[19]", "pi_A[20]", 
"pi_A[21]", "pi_A[22]", "pi_A[23]", "pi_A[24]", "pi_A[25]", "pi_A[26]", 
"pi_A[27]", "pi_A[28]", "pi_A[29]", "pi_A[30]", "pi_A[31]", "pi_A[32]", 
"pi_A[33]", "pi_A[34]", "pi_A[35]", "pi_A[36]", "pi_A[37]", "pi_A[38]", 
"pi_A[39]", "pi_A[40]", "pi_A[41]", "pi_A[42]", "pi_A[43]", "pi_A[44]", 
"pi_A[45]", "pi_A[46]", "pi_A[47]", "pi_A[48]", "pi_A[49]", "pi_A[50]", 
"pi_A[51]", "pi_A[52]", "pi_A[53]", "pi_A[54]", "pi_A[55]", "pi_A[56]", 
"pi_A[57]", "pi_A[58]", "pi_A[59]", "pi_A[60]", "pi_A[61]", "pi_A[62]", 
"pi_A[63]", "pi_A[64]", "qi_A[1]", "qi_A[2]", "qi_A[3]", "qi_A[4]", 
"qi_A[5]", "qi_A[6]", "qi_A[7]", "qi_A[8]", "qi_A[9]", "qi_A[10]", 
"qi_A[11]", "qi_A[12]", "qi_A[13]", "qi_A[14]", "qi_A[15]", "qi_A[16]", 
"qi_A[17]", "qi_A[18]", "qi_A[19]", "qi_A[20]", "qi_A[21]", "qi_A[22]", 
"qi_A[23]", "qi_A[24]", "qi_A[25]", "qi_A[26]", "qi_A[27]", "qi_A[28]", 
"qi_A[29]", "qi_A[30]", "qi_A[31]", "qi_A[32]", "qi_A[33]", "qi_A[34]", 
"qi_A[35]", "qi_A[36]", "qi_A[37]", "qi_A[38]", "qi_A[39]", "qi_A[40]", 
"qi_A[41]", "qi_A[42]", "qi_A[43]", "qi_A[44]", "qi_A[45]", "qi_A[46]", 
"qi_A[47]", "qi_A[48]", "qi_A[49]", "qi_A[50]", "qi_A[51]", "qi_A[52]", 
"qi_A[53]", "qi_A[54]", "qi_A[55]", "qi_A[56]", "qi_A[57]", "qi_A[58]", 
"qi_A[59]", "qi_A[60]", "qi_A[61]", "qi_A[62]", "qi_A[63]", "qi_A[64]"
), class = "data.frame")

现在我想添加一些垂直虚线。我希望为每条垂直线使用不同的颜色,并为这些线条设置图例。这些垂直线的信息位于另一个数据框observed_mean

dput(observed_mean)
structure(list(TRT = structure(1:9, .Label = c("A", "B", "C", 
"D", "E", "F", "G", "H", "I"), class = "factor"), gmcmin = c(967.117632548, 
1306.76729845833, 2394.519441584, 2404.73065902857, 3047.48745766364, 
2550.12866139, 1863.6505272925, 3569.57489109, 3660.40695204)), .Names = c("TRT", 
"gmcmin"), row.names = c(NA, -9L), class = "data.frame")

以下是生成情节的代码:

range <- range(plot_band$exp_X_post)
range <- c(floor(range[1]), ceiling(range[2]))
step <- floor((range[2] - range[1]) / 10)

ggplot(plot_band, aes(x = exp_X_post, y = mean, 
                              color = outcome, linetype = outcome)) + 
    geom_ribbon(aes(ymin = p2.5, ymax = p97.5, linetype = NA,
                    fill = outcome), 
                alpha = 0.4) +
    geom_line(size = 1.5) + 
    xlab("Exposure") +
    ylab("Proability of CB/DLT") +
    scale_x_continuous(limits = range,
                       breaks = seq(range[1], range[2], by = step)
                       ) +
    geom_vline(xintercept = observed_mean$gmcmin,
               linetype = 'longdash') +
    theme_bw() +
    theme(legend.position = 'top',
          plot.margin = unit(c(1, 1, 3, 1), "lines"),
          legend.title = element_text(size = 15),
          axis.title.y = element_text(margin = margin(0, 15, 0, 0))) +
    scale_color_discrete(name = "Probability (95% CI)") +
    scale_fill_discrete(name = "Probability (95% CI)") +
    scale_linetype_discrete(name = "Probability (95% CI)") 

注意:最后三行用于将图例标题从变量名称outcome更改为“概率(95%CI)”。不确定这是否正确。

问题:

  1. 我希望将当前的图例放在右边,然后在下面,我想将图例放在垂直线上。谁能给我一些线索怎么做?

  2. 如图所示,顶部有两个相同(不同颜色)的图例。如果我使用以下代码更改因子outcome的顺序,则会出现以下内容。我不确定为什么会这样。我怎么能摆脱它?

    plot_band $ outcome&lt; - factor(plot_band $ outcome,levels = c(“DLT”,“CB”))

  3. 非常感谢任何意见/建议!!

    enter image description here

1 个答案:

答案 0 :(得分:1)

额外的图例框显示是因为linetype = NA aes() geom_ribbon中的geom_text将线型移出映射将会解决这个问题。

对于线条标注,您可以使用# install.packages("devtools") # devtools::install_github("slowkow/ggrepel") library(ggrepel) ggplot(plot_band, aes(x = exp_X_post, y = mean, color = outcome, linetype = outcome)) + geom_ribbon(aes(ymin = p2.5, ymax = p97.5, fill = outcome), alpha = 0.4 , linetype = "blank") + geom_line(size = 1.5) + xlab("Exposure") + ylab("Proability of CB/DLT") + scale_x_continuous(limits = range, breaks = seq(range[1], range[2], by = step) ) + geom_vline(xintercept = observed_mean$gmcmin , linetype = 'longdash') + geom_text_repel( mapping = aes( x = gmcmin , y = 0 , label = TRT , color = NA , linetype = NA) , data = observed_mean , show.legend = FALSE) + theme_bw() + theme(legend.position = 'top', plot.margin = unit(c(1, 1, 3, 1), "lines"), legend.title = element_text(size = 15), axis.title.y = element_text(margin = margin(0, 15, 0, 0))) + scale_color_discrete(name = "Probability (95% CI)") + scale_fill_discrete(name = "Probability (95% CI)") + scale_linetype_discrete(name = "Probability (95% CI)")

将标签放在图上

这是一个完整的情节,做了类似的事情(现在用ggrepel来更明智地放置标签 - 不能相信我没有从那里开始)

observed_mean

(注意:平均标签重叠,因此您可能需要更仔细地对其进行定位,例如,通过向ggplot(plot_band, aes(x = exp_X_post, y = mean, color = outcome)) + geom_ribbon(aes(ymin = p2.5, ymax = p97.5, fill = outcome), alpha = 0.4 , linetype = "blank") + geom_line(#aes(linetype = outcome) #, size = 1.5 # , show.legend = FALSE ) + xlab("Exposure") + ylab("Proability of CB/DLT") + scale_x_continuous(breaks = pretty(range)) + geom_vline( mapping = aes(xintercept = gmcmin , linetype = TRT) , data = observed_mean) + theme_bw() + theme(legend.position = 'right', plot.margin = unit(c(1, 1, 3, 1), "lines"), legend.title = element_text(size = 15), axis.title.y = element_text(margin = margin(0, 15, 0, 0))) + scale_color_discrete(name = "Probability (95% CI)") + scale_fill_discrete(name = "Probability (95% CI)") + scale_linetype_discrete(name = "Treatment") 添加另一列,为您绘制所需位置。

如果您需要将标签放在图例中,则可以使用以下代码:

geom_line()

注意,我从主线中删除了线型,因为它引起了垂直线的一些奇怪。您可以通过取消注释t = {} print(t[1]) >>nil 中的部分来添加它,但请注意它随后会显示在列表中并显示处理。如果你绝对需要它,可能有办法解决这个问题,但我的快速尝试无效。但是,我会注意到,线型有点难以挑选出来。

Example plot with both the legend and the labels