2017-02-22 4 views
1

以下のMWEは私の本当の目標を単純化します。しかし、私は描画に長い時間がかかる背景イメージを持っています(下の例では、単純に32 mtcarsのデータセット値の散布図です)。ユーザーは自分の背景画像から特定のポイントをクリックすることができ、これにより新しいポイントがプロットされます。私の目指しているのは、これらの新しいポイントを最上位レイヤーに単純に再描画することですが、バックグラウンド画像散布図は、時間と計算を節約するために再描画する必要はありません。次のようにバックグラウンドプロットを再描画せずに、プロットしたRに対話的にポイントを追加する

マイMWEは:

library(plotly) 
library(htmlwidgets) 

g <- ggplot(mtcars, aes(x=mpg, y=cyl)) + geom_point() 
gP <- ggplotly(g) 

gP %>% onRender(" 
      function(el, x) { 
      myGraph = document.getElementById(el.id); 

      el.on('plotly_click', function(e) { 

       console.log(e) 
       console.log(e.points[0].x) 

       var trace1 = { 
       x: [e.points[0].x-.3, e.points[0].x-.3, e.points[0].x+.3, e.points[0].x+.3], 
       y: [e.points[0].y-.3, e.points[0].y+.3, e.points[0].y-.3, e.points[0].y+.3], 
       type: 'scatter', 
       fillColor : 'red', 
       size: 20 
       }; 

       Plotly.addTraces(el.id, trace1); 
      })} 
      ") 

32個の黒点、4色の赤色の点のいずれかをユーザーがクリックをクリック黒色点の周りに描かれている場合。これは主に動作しており、32個の黒のデータポイントのいずれかをクリックすると、その周囲に4つの色付きの点が描かれています。しかし、私はいくつかの質問で苦労したままです:

1)どのようにして4つの色付きの点が線で結ばれないように改善できますか?

2)サイズとfillColorを実際に動作させるにはどうすればよいですか?私がその価値を変えたとき、私はそれらの価値が変わるのを見ません。

3)対話性と描画をできるだけ速くするには、合理的な構文ですか?背景画像が効率的に再描画されていないのは確かですが、このシンタックスを初めて熟知しているので、それについての確認が大好きです。トップレイヤーに100ポイントの新しいポイントを追加すると、それでも効率的でしょうか?そうでない場合は、構文の改善のためのアドバイスを聞いていただければ幸いです。

ありがとうございます。

答えて

1

1)どのようにして4つの着色点が が行単位で接続されないように改善できますか?

どのようにサイズとfillcolorのは、実際に動作させることができます)あなたのtraceオブジェクト

2にmode: 'markers'を追加しますか? の値を変更すると、効果があるとは限りません。

値はオブジェクト内であることが必要とfillColorcolorする必要があります。

marker: 
{ 
    color: 'red', 
    size: 20   
} 

3)これは、インタラクティビティを作成し、可能な限り速く描画するために合理的な構文ですか?背景画像が が効率的に再描画されていないと確信していますが、このシンタックスを初めて熟知しているので、 の確認が大好きです。最上位層に 点の新しいポイントを追加すると、それでも効率的ですか? がない場合は、 の構文の改善に関する推奨事項に関するアドバイスをお寄せいただき、誠にありがとうございます。

これは少し意見に基づいています。問題はggplotを使って複雑なプロットを作成するテンプレートを作成することです。 100ポイントでは、クリックごとにかなりの遅延があります。

x/y軸の範囲を固定すると、新しい値が古い値の範囲外の場合にグラフのサイズを変更する必要があるため、描画が少し改善されます。

gP %>% 
    layout(
    xaxis = list(range = c(8, 35)), 
    yaxis = list(range = c(3, 9)) 
) 

あなたはggplotlyあなたは一度だけトレースを作成し、extendTracesを経由して値を追加することができずに使用してプロットを描くことができます。

しかし、私はそれが得られるほど良いと思う、最終的には、それはブラウザベースのライブラリであり、スタンドアロンのプログラムではない。


library(plotly) 
library(htmlwidgets) 

g <- ggplot(mtcars, aes(x=mpg, y=cyl)) + geom_point() 
gP <- ggplotly(g) 
gP %>% 
layout(
    xaxis = list(range = c(8, 35)), 
    yaxis = list(range = c(3, 9)) 
) 

gP %>% onRender(" 
function(el, x) { 
    myGraph = document.getElementById(el.id); 
    el.on('plotly_click', function(e) 
    { 

     var trace1 = { 
     x: [], 
     y: [], 
     mode: 'markers', 
     marker: { 
      color: 'red', 
      size: 20 
     } 
     }; 
     for (var i = 0; i < 100; i+= 1){ 
     trace1.x.push(e.points[0].x + Math.random() - 0.5) 
     trace1.y.push(e.points[0].y + Math.random() - 0.5) 
     } 
    Plotly.addTraces(el.id, trace1); 
    } 
)} 
") 
関連する問題