2017-11-05 12 views
1

私は、穴あけプロファイルを表す複数の積み上げ縦棒グラフを持っています。私はに地面の実際の高さを表すために各坑井のy位置をオフセットしたいとします。ggplot2を使用して積み重ねた列プロットに垂直方向オフセットを追加します。

マイデータは、次のようになります。

x layer.thickness layer.depth Petrography BSCategory Offset 
0    0.2   0.2  silt  Drilling1  0 
0    1.0   1.2  gravel  Drilling1  0 
0    3.0   4.2  silt  Drilling1  0 
4    0.4   0.4  silt  Drilling2  -1 
4    0.8   1.2  gravel  Drilling2  -1 
4    2.0   3.2  sand  Drilling2  -1 

マイ最小動作するコードは、これまでのところ、このです:赤とこれはこれまでのところ、私の出力である

df <- data.frame(x=c(0,0,0,4,4,4), layer.thickness = c(0.2,1.0,3.0,0.4,0.8,2.0), 
       layer.depth = c(0.2,1.2,4.2,0.4,1.2,3.2), 
       Petrography = c("silt", "gravel", "silt", "silt", "gravel", "sand"), 
       BSCategory = c("Drilling1","Drilling1","Drilling1","Drilling2","Drilling2","Drilling2"), 
       Offset = c(0,0,0,-1,-1,-1)) 

# provide a numeric ID that stops grouping individual petrography items 
df <- transform(df,ix=as.numeric(factor(df$BSCategory))); 


drilling <- ggplot(data = df, aes(x = x, y = layer.thickness, group = ix, fill = Petrography)) + 
    theme_minimal() + 
    theme(axis.line = element_line(colour = "black"), 
     panel.grid.major = element_blank(), 
     panel.grid.minor = element_blank(), 
     panel.border = element_blank(), 
     panel.background = element_blank(), 
     axis.line.x = element_blank(), 
     axis.ticks.y = element_line(), 
     aspect.ratio=1) + 
    geom_col(position = position_stack(reverse = TRUE), width= .15,color="black") + 
    scale_y_reverse(expand = c(0, 0), name ="Depth [m]") + 
    scale_x_continuous(position = "top", breaks = df$x, labels=paste(df$BSCategory,"\n",df$x,"m"), name="") + 
    scale_fill_manual(values = c("gravel"='#f3e03a', "sand"= '#e09637', "silt"='#aba77d')) 

print(drilling) 

(これは何を示しています次のようになります):

Example of drilling profiles

答えて

2

ここでgeom_rectで作業する方が簡単かもしれません(棒グラフはゼロに固定してください)。まず、各試料についてy開始位置と終了位置を計算する必要があります。

library(data.table) 
setDT(df)[ , `:=`(start = start <- c(Offset[1] + c(0, cumsum(head(layer.thickness, -1)))), 
        end = start + layer.thickness), by = BSCategory] 

geom_rectは、簡単に個々のサンプルに境界線を追加することができ、両方のfillcolor美学を持っています。あるいは

enter image description here


w <- 0.5 # adjust to desired width 

ggplot(data = df, aes(xmin = x - w/2, xmax = x + w/2, ymin = start, ymax = end, 
         fill = Petrography, group = Petrography)) + 
    geom_rect(color = "black") + 
    scale_y_reverse(expand = c(0, 0), name ="Depth [m]") + 
    scale_x_continuous(position = "top", breaks = df$x, labels = paste(df$BSCategory,"\n", df$x, "m"), name = "") + 
    scale_fill_manual(values = c("gravel" = '#f3e03a', "sand" = '#e09637', "silt" = '#aba77d')) + 
    theme_classic() + 
    theme(axis.line.x = element_blank(), 
     axis.ticks.x = element_blank()) 

geom_segmentを使用することができます。 geom_segmentfill aesを持っていないので、我々は colorに変更する必要があります。

ggplot(data = df, aes(x = x, xend = x, y = start, yend = end, color = Petrography, group = ix)) + 
    geom_segment(size = 5) + 
    scale_y_reverse(expand = c(0, 0), name ="Depth [m]") + 
    scale_x_continuous(position = "top", breaks = df$x, labels = paste(df$BSCategory,"\n", df$x, "m"), name = "") + 
    scale_color_manual(values = c("gravel" = '#f3e03a', "sand" = '#e09637', "silt" = '#aba77d')) + 
    theme_classic() + 
    theme(axis.line.x = element_blank(), 
     axis.ticks.x = element_blank()) 

enter image description here

国境を追加するには、Add border to segments in geom_segmentを参照してください。

+1

非常にありがとうございました!他の人たちのために:私は私の質問の画像が示すように黒いボーダールックを作成するために、さらに2つの 'geom_segments'を追加しました: ' geom_segment(aes(x =(x)、xend =(x)、y = start-0.geom_segment(size = drill_width)+ geom_segment(size = drill_width、color = "black"、aes(y = start-0.014、yend = end + 0.014)、size = drill_width + 1、color = "black" yend = start、x = x、xend = x))+ ... ' – Valentin

関連する問題