2013-10-11 20 views
2

我有一個三組的情節。我已經使用方面來獲取圖形,並且我設法將顏色和形狀合併爲一個圖例(如下所示)。然而,問題在於圖例包含所有六個變量名稱,而只有兩個變量名稱就足夠了。是否有可能在ggplot2圖例中包含變量的子集?

這裏是我的電流輸出: enter image description here

是否有可能獲得只用兩個鍵一個傳說:「三岔口」和「女性%」(而不是現在的6個按鍵)?

這裏是用來生產情節的代碼:

years <- c('97','98','99','00','01','02','03','04','05','06','07','08','09','10','11') 
years <- factor(years, levels=years, ordered=T)    
phy_ratio <- c(0.124516129032258, 0.11545988258317, 0.115190784737221, 0.120919881305638, 0.132198952879581, 0.147636363636364, 0.171033478893741, 0.155994550408719, 0.150121065375303, 0.182989690721649, 0.19466515323496, 0.194550408719346, 0.203811540497618, 0.214399152991001, 0.195157384987893) 
phy_kldiv <- c(0.040955264723678, 0.001463273151143, 0.011790601776013, 0.00575319295143, 0.003434619043043, 0.001405575036774, 0., 0.002864433864471, 0.006622155735437, 0.074859543690491, 0.013087320475828, 0.023585193439178, 0.08866626868359, 0.07879809266254, 0.04536730602564) 
mat_ratio <- c(0.236086175942549, 0.253846153846154, 0.256481481481481, 0.246901811248808, 0.273267326732673, 0.290076335877863, 0.265861027190332, 0.283457249070632, 0.27098919368246, 0.296156744536549, 0.289834174477289, 0.309506790564689, 0.311612903225806, 0.293710691823899, 0.286604361370716) 
mat_kldiv <- c(0.024935971694693, 0.012778283551598, 0.019350970177576, 0.00988763992456, 0.008284622131022, 0.014700010603506, 0.015235482499119, 0.023914776035294, 0.018878559121565, 0.073688344207842, 0.042784809873074, 0.052110805729914, 0.072367460713338, 0.017494663842138, 0.019605349179071) 
psc_ratio <- c(0, 0, 0, 0.370182555780933, 0.325227963525836, 0.416528925619835, 0.379727685325265, 0.333901192504259, 0.396440129449838, 0.357142857142857, 0.412265758091993, 0.415605095541401, 0, 0, 0) 
psc_kldiv <- c(0, 0, 0, 0.156958669813655, 0.02319115435268, 0.019560312744745, 0.142939013816555, 0.050687092785045, 0.030903744617805, 0.021234599637716, 0.049901381314152, 0.176930275568253, 0, 0, 0) 
df <- data.frame("Years"=years, 
       '% of Women (Physics)'=phy_ratio, 
       'Divergence (Physics)'=phy_kldiv, 
       '% of Women (Maths)'=mat_ratio, 
       'Divergence (Maths)'=mat_kldiv, 
       '% of Women (Polit. Sci.)'=psc_ratio, 
       'Divergence (Polit. Sci.)'=psc_kldiv, 
       check.names=F) 
df.m <- melt(df, id="Years") 
df.m <- transform(df.m, facet=ifelse(variable %in% c('% of Women (Physics)', 
                 'Divergence (Physics)'), 'phy', 
           ifelse(variable %in% c('% of Women (Maths)', 
                  'Divergence (Maths)'),'mat', 
             ifelse(variable %in% c('% of Women (Polit. Sci.)', 'Divergence (Polit. Sci.)'), 'psc', 'mat')))) 
g <- ggplot(df.m, aes(group=1, x=Years, y=value, colour=variable, shape=variable)) 
g <- g + scale_colour_manual(name='', 
          labels=c('Phy: % of Women', 'Phy: Divergence', 
             'Maths: % of Women', 'Maths: Divergence', 
             'Polit. Sci: % of Women', 'Polit. Sci: Divergence'), 
          values=c('chartreuse4', 'deepskyblue3', 'chartreuse4', 'deepskyblue3', 'chartreuse4', 'deepskyblue3')) 
g <- g + scale_shape_manual(name='', 
          labels=c('Phy: % of Women', 'Phy: Divergence', 
            'Maths: % of Women', 'Maths: Divergence', 
            'Polit. Sci: % of Women', 'Polit. Sci: Divergence'), 
          values=c(19, 17, 19, 17, 19, 17)) 
g <- g + geom_point(aes(colour=variable), size=3) 
g <- g + facet_grid(.~facet) 
g <- g + coord_cartesian(ylim=(c(0.0,0.45))) 
g <- g + scale_x_discrete("", expand=c(0.01, 0.01)) 
g <- g + scale_y_continuous(name="") 
g <- g + guides(colour=guide_legend(title='', ncol=2, keywidth=unit(2,'lines'))) 
g <- g + theme(legend.position=c(0.33,0.72), 
       legend.justification=c(0,0), 
       legend.key=element_blank(), 
       legend.background=element_rect(colour='black', fill='transparent'), 
       legend.text=element_text(size=12), 
       panel.grid.minor = element_blank(), 
       panel.margin=unit(1, 'lines'), 
       axis.text=element_text(size=12,color="black"), 
       axis.title=element_text(size=16), 
       strip.text.y = element_text(size = 14)) 
+0

是的,只需將顏色和形狀映射到僅包含這兩個值的變量即可。你能發佈你的代碼嗎? – Peyton

+0

沒有看到你是如何做到這一點的,很難提供幫助。然而,我猜測你有一個單欄,其中包含有關部門(Phy,Maths,Polit.Sci)和變量(婦女百分比,分歧)的信息。你必須將第一部分拆分出來才能夠面向它。現在,您只需將可變部分拆分出來,並將其用作形狀/顏色的映射。可以通過一個可重複的例子給出更具體的答案。 –

+0

根據您的意見,我已經包含用於生成此圖表的代碼。 –

回答

1

拿起你的df

補庫定義後使用明確的:

library("ggplot2") 
library("reshape2") 
library("grid") 

一種不同的方式,使df.m其中還包括拉出兩個不同的措施(「女性% 「和」Divergence「)分成一列和部門(」數學「,」物理學「,」政治科學「)。

df.m <- melt(df, id="Years") 
df.m$measure <- gsub("(.*) \\(.*", "\\1", df.m$variable) 
df.m$facet <- gsub(".*\\((.*)\\)", "\\1", df.m$variable) 

將您的繪圖代碼放入一個語句中。現在將colourshape映射到該度量,而不是variable。秤的手冊shapecolour也只有兩個條目。我把傳奇移到了頂端,僅僅是因爲它不再是相同的尺寸/形狀,所以沒有像之前那麼好排列;你可以把它放在任何你想要的地方。

ggplot(df.m, aes(group=1, x=Years, y=value, colour=measure, shape=measure)) + 
    scale_colour_manual(name='', values=c('chartreuse4', 'deepskyblue3')) + 
    scale_shape_manual(name='', values=c(19, 17)) + 
    geom_point(size=3) + 
    facet_grid(.~facet) + 
    coord_cartesian(ylim=(c(0.0,0.45))) + 
    scale_x_discrete("", expand=c(0.01, 0.01)) + 
    scale_y_continuous(name="") + 
    guides(colour=guide_legend(title='', ncol=2, keywidth=unit(2,'lines'))) + 
    theme(legend.position="top", 
      legend.key=element_blank(), 
      legend.background=element_rect(colour='black', fill='transparent'), 
      legend.text=element_text(size=12), 
      panel.grid.minor = element_blank(), 
      panel.margin=unit(1, 'lines'), 
      axis.text=element_text(size=12,color="black"), 
      axis.title=element_text(size=16), 
      strip.text.y = element_text(size = 14)) 

enter image description here


要獲得關於僅具有特定值在圖例中顯示確切的問題,你可以使用breaks參數的規模。使用這些scale_colour_manualscale_shape_manual線來代替:

g <- g + scale_colour_manual(name='', 
          breaks=c('% of Women (Physics)', 'Divergence (Physics)'), 
          labels=c('% of Women', 'Divergence'), 
          values=c('chartreuse4', 'deepskyblue3','chartreuse4', 
             'deepskyblue3', 'chartreuse4', 'deepskyblue3')) 
g <- g + scale_shape_manual(name='', 
          breaks=c('% of Women (Physics)', 'Divergence (Physics)'), 
          labels=c('% of Women', 'Divergence'), 
          values=c(19, 17, 19, 17, 19, 17)) 

然而,使您的數據準確反映你試圖映射到美學的一件事是,從長遠來看更好。

+0

謝謝你對答案的美麗解釋。代碼更短,更簡單,並且做我希望它做的事情。 –

1

我會簡單地製作的「女性%」和「三岔口」分組變量做到這一點。你的情況特別容易,因爲這兩個詞的長度完全相同。您可以使用substr從整個字符串中拆分出所需的術語。希望別人會在ggplot2本身的範圍內如何做到這一點。

這裏我只是做一個新的變量來表示你想要着色的兩組。

df.m$groups = substr(df.m$variable, 1, 10) 

然後,只需使用這個變量作爲您的colorshape美學而不是variable

ggplot(df.m, aes(x=Years, y=value, colour=groups, shape=groups)) + 
    geom_point(size=3) + 
    facet_grid(.~facet) + 
    scale_colour_manual(values = c("chartreuse4", "deepskyblue3")) 
+0

+1爲答案。然而,我正在與布萊恩的回答。對於像我這樣的R新手來說,解釋真的有很大的幫助。 –

相關問題