2017-02-17 10 views
2

私はplotlyでggplot2ファセットを使用したいと思いますが、ticktextの代わりにyaxisの範囲の値を示すy軸のラベルに問題があります。私が正しく描画するためにplotly_buildを使ってplotlyオブジェクトで変更できるものはありますか?私は実際にggplots上の光沢のあるアプリで陽気なホバー機能を活用したいと思います。私はプロットでファセットに関連する他のいくつかの質問を見つけましたが、ggplotではなくプロットしてサブプロットを使用するようにユーザーをリダイレクトするように見えます。私の場合、ファセットデータは消えていません、yaxisはちょうど壊れています。Rのfacet_gridを使ったgotplotとggplot:yaxisラベルに範囲値の代わりにticktext値を使う方法は?

リファレンス質問: Error plotting chart with facet_wrap and scales = "free" in plotly

面での問題を示してmtcarsデータセットと、以下のコード例を参照してください。 ggplotオブジェクトを見ると、ラベルが正しいことになります。

mtcarsデータセットを少数のモデルに減らすようなサブプロットの数を減らすと、問題は解決されたようです。なぜサブマップの数がyaxis目盛りのラベルに影響しますか?また、破損しているファセット/グループは1つのアイテムしか持たない(最初のy軸でない限り)、1つ以上のアイテムを持つファセット(少なくともこの例では)がy軸を正しくプロットしているように見えます。私が正しく描画するためにplotly_buildを使ってplotlyオブジェクトで変更できるものはありますか?私は実際にggplots上の光沢のあるアプリで陽気なホバー機能を活用したいと思います。

library(plotly) 
library(ggplot2) 
library(data.table) 
library(datasets) 

#add fake model for use in facet 
dt<-data.table(mtcars) 
dt[,car.id:=rownames(mtcars)] 
dt[,model:=substr(car.id,1,regexpr(" ",car.id)-1)][model=="",model:=car.id] 

#Optional toggle: pick a few models and issue seems to go away 
#Use data=dt[model %in% c("Mazda","Merc","Toyota","Honda","Hornet")] 
ggplot.test<-ggplot(dt,aes(mpg,car.id))+geom_point()+facet_grid(model~.,scales="free_y",space="free",drop=TRUE) 

#check ggplot in Plots 
ggplot.test 

#broken ggplotly object in Viewer 
ggplotly(ggplot.test) 

ggplotプロット:y軸ラベルを壊れたplotlyで GGPLOT MTCARS FACET

同じプロットは: PLOTLY GGPLOT MTCARS FACET

答えて

2

これはggplotPlotlyへの変換からいくつかの奇妙なアーティファクトのように見えます。それはすでに、すでに正しく表示するので とにかく、あなたは何をする必要があるか、すべてはticktextに空の文字列を追加し、1

for (i in 2:22) { 
    tick_l <- length(p[['x']][['layout']][[paste('yaxis', i, sep='')]][['ticktext']]) + 1 
    p[['x']][['layout']][[paste('yaxis', i, sep='')]][['tickvals']] <- seq(1, tick_l) 
    p[['x']][['layout']][[paste('yaxis', i, sep='')]][['ticktext']][[tick_l]] <- '' 
} 

最初のY軸レイアウトは休息と同じですが、固定を必要としないことでtickvalsを拡大することです。全体のプロットを修正


fixed it


はもう少し調整が必要です。私はできるだけジェネリックとして作成しようとしましたが、おそらく変換はそれぞれのプロットごとに異なるものになるでしょう。

Even more fixes

library(plotly) 
library(ggplot2) 
library(data.table) 
library(datasets)  

#add fake model for use in facet 
dt<-data.table(mtcars) 
dt[,car.id:=rownames(mtcars)] 
dt[,model:=substr(car.id,1,regexpr(" ",car.id)-1)][model=="",model:=car.id] 

#Optional toggle: pick a few models and issue seems to go away 
#Use data=dt[model %in% c("Mazda","Merc","Toyota","Honda","Hornet")] 
ggplot.test<-ggplot(dt,aes(mpg,car.id))+geom_point()+facet_grid(model~.,scales="free_y",space="free",drop=TRUE) 

p <- ggplotly(ggplot.test) 
len <- length(unique(dt$model)) 

total <- 1 
for (i in 2:len) { 
    total <- total + length(p[['x']][['layout']][[paste('yaxis', i, sep='')]][['ticktext']]) 
} 

spacer <- 0.01 #space between the horizontal plots 
total_length = total + len * spacer 
end <- 1 
start <- 1 

for (i in c('', seq(2, len))) { 
    tick_l <- length(p[['x']][['layout']][[paste('yaxis', i, sep='')]][['ticktext']]) + 1 

    #fix the y-axis 
    p[['x']][['layout']][[paste('yaxis', i, sep='')]][['tickvals']] <- seq(1, tick_l) 
    p[['x']][['layout']][[paste('yaxis', i, sep='')]][['ticktext']][[tick_l]] <- '' 

    end <- start - spacer 
    start <- start - (tick_l - 1)/total_length 
    v <- c(start, end) 
    #fix the size 
    p[['x']][['layout']][[paste('yaxis', i, sep='')]]$domain <- v 
} 

#fix the first entry which has a different name than the rest 
p[['x']][['layout']][['annotations']][[3]][['y']] <- (p[['x']][['layout']][['yaxis']]$domain[2] + p[['x']][['layout']][['yaxis']]$domain[1]) /2 
p[['x']][['layout']][['shapes']][[2]][['y0']] <- p[['x']][['layout']][['yaxis']]$domain[1] 
p[['x']][['layout']][['shapes']][[2]][['y1']] <- p[['x']][['layout']][['yaxis']]$domain[2] 

#fix the annotations 
for (i in 3:len + 1) { 
    #fix the y position 
    p[['x']][['layout']][['annotations']][[i]][['y']] <- (p[['x']][['layout']][[paste('yaxis', i - 2, sep='')]]$domain[1] + p[['x']][['layout']][[paste('yaxis', i - 2, sep='')]]$domain[2]) /2 
    #trim the text 
    p[['x']][['layout']][['annotations']][[i]][['text']] <- substr(p[['x']][['layout']][['annotations']][[i]][['text']], 1, length(p[['x']][['layout']][[paste('yaxis', i - 2, sep='')]][['ticktext']]) * 3 - 3) 
} 

#fix the rectangle shapes in the background 
for (i in seq(0,(len - 2) * 2, 2)) { 
    p[['x']][['layout']][['shapes']][[i+4]][['y0']] <- p[['x']][['layout']][[paste('yaxis', i /2 + 2, sep='')]]$domain[1] 
    p[['x']][['layout']][['shapes']][[i+4]][['y1']] <- p[['x']][['layout']][[paste('yaxis', i /2 + 2, sep='')]]$domain[2] 
} 
p 
+0

ありがとうございます!これは確実にy軸を固定します。 ggplotlyはまだサブグループを同じサイズにしているので空白= "フリー"引数を無視しているようです... – MelissaG

+0

@MelissaGそれは全く受け入れられません;)更新された回答を参照してください –

+0

あなたは私の期待を上回りました...そしてすごいです! – MelissaG

関連する問題