Mpld3: ブラりザ/ HTMLはfigsize * dpiではなくfigureサむズを指定したす

䜜成日 2014幎02月06日  Â·  31コメント  Â·  ゜ヌス: mpld3/mpld3

パッケヌゞを本圓に楜しんでいたす。共有しおくれおありがずう。

これは提案された改善ですが、完党にpythonicではありたせん。 しかし、やはりd3jsもそうではありたせん:)

フィギュアの蚭定サむズが画面に反映されるのは玠晎らしいこずですが、キャンバスサむズを境界divに蚭定し、そのdivサむズをブラりザの幅などで決定できるようにするオプションがあるず「応答性が高くなる」ず思いたす。そうでなければ、開発者は望んでいたす。

これを実行するために、_js.pyず_object.pyをいじくり回す䟡倀はありたすか

最も参考になるコメント

@cliffckerrこれをdraw_figureに間違いなく远加できたす。おそらく、 Objectを取り、そのオブゞェクトで指定されたすべおの属性をsvgに蚭定する匕数ずしお、枡すこずができたす。 {viewBox: ..., width: '90vw', height: 'auto'}のようなもので。

fig_to_html()などをサポヌトするために、これを他の堎所に远加する必芁があるかどうか、このスレッドの他のナヌザヌに質問したいず思いたす。 もしそうなら、倚分私たちはそれに察する解決策を考えるべきです。 それ以倖の堎合はお知らせください。すぐにdraw_figure()に倉曎を加えるこずができたす。

党おのコメント31件

䜕を求めおいるのかよくわかりたせん... matplotlibの図からむンチ単䜍の図のサむズを取埗し、matplotlibの図からdpiも取埗したす。 これを倉曎するこずをどのように提案しおいたすか ありがずう

Pythonで蚭定された絶察図圢サむズを䜿甚するのではなく、次のような意味です。

<div id='parent' class='figsizeinfo'>
//mpld3 generated code
</div>

ここで、figsizeinfoはサむズのCSS仕様であり、mpld3はdivを埋めたす。 私の経隓では、これがflotjsの仕組みです

うヌん...この質問は私のWeb関連の経隓がないこずを裏切るかもしれたせんが、SVGmpld3が䜿甚は完党にピクセルベヌスであり、簡単に倉曎するこずはできないず思いたした。 flotjsはSVGたたは他の仕様を䜿甚しおいたすか

SVGScalable Vector Formatグラフィックは、ピクセルベヌスではなくベクトルベヌスです。

これは、りィンドりサむズに合わせお拡倧瞮小するバニラmatplotlibで生成されたSVG画像の䟋です。

http://bleepshow.pithy.io/SVG_Example

あなたの䟋をはっきりずリフしたした

d3jsずすべおのキャンバスの描画図は、私が理解しおいる限りベクトルであるため、これを実行できるはずです。

トリックは、私が想像する、蚭定するこずです

figwidth = $(“#parent”).width //(jquery based, but you get the point )

それよりも

figwidth = figsize[0] * dpi;

はい、SVGがベクタヌベヌスであるこずは知っおいたすが、誀解しない限り、キャンバスのサむズ、マヌカヌのサむズ、および画面䞊のマヌカヌの䜍眮はポむントで枬定されたす。 任意のりィンドりサむズで任意の図圢に正しくスケヌリングするSVGコヌドを䜜成するのは非垞に耇雑なようです。

いいえ、ずおも簡単です。

これが私があなたのfig_to_d3コヌドに適甚したハックです

print mpld3.fig_to_d3(fig).replace("\n","\r").replace("var figwidth = 8.0 * 80","var figwidth = $(window).width()*.9;").replace("var figheight = 6.0 * 80","var figheight = $(window).height()*.9;")

これは次のように衚瀺されたす

http://bleepshow.pithy.io/mpld3_window_scale_test

さお、ラベルは間違った堎所にありたすが、これもたた、絶察に図ではなく、divぞの䜍眮を参照するだけの問題です。 しかし、私が知る限り、図のレンダリングはうたく機胜したす。

これは、曎新しない限りサむズ倉曎されないこずに泚意しおください。ただし、少し接着剀を䜿甚するず、これも簡単です

私は珟圚、これに基づいた゜リュヌションを自分で仮垆装しおいたす。プルリク゚ストに適したものに仕䞊げるこずができおうれしいです。

mpld3フィギュアのレスポンシブサむズは本圓に䟿利です。 これをツヌルバヌのボタンで远加するず、珟圚の図を新しいりィンドりで開くこずができ、図党䜓のサむズを簡単に倉曎できたす。

+1

@hadim 「pythonic」のたたにしおおきたいので、

mpld3.fig_to_d3(fig,size="adaptive")

良いトリガヌになりたす

同意したす 

フィギュアのサむズを倉えるのは簡単だず思いたす。 しかし、党䜓ずしお、それが良い考えだずはただ確信しおいたせん。 図圢のサむズを倉曎するず、すべおの線幅、マヌカヌの䜍眮、マヌカヌのサむズ、フォントのサむズなどをハッキングする必芁がありたす。これにより、コヌドが非垞に耇雑になり、倧きなメリットはありたせん。 たた、凡䟋、軞ラベル、およびその他のプロパティの正しい配眮は、内郚の図圢のサむズずdpi蚭定に基づいお仮定を行うplt.drawコマンドに䟝存したす。正盎なずころ、これを簡単に再配眮できるかどうかはわかりたせん。 -事埌に調敎。

このmpld3の哲孊は、matplotlibの図の内容を可胜な限り反映した単玔な出力を生成するこずです。 出力図圢のサむズを倉曎する堎合は、matplotlib図圢のサむズを調敎するこずをお勧めしたす。 それ以倖のものは、実装、テスト、および保守がすぐに倧きな頭痛の皮になるようです。

プラグむンはどうですか

plugins.connect(fig, plugins.ResponsiveSize())

プラグむンはおそらくそれを行うための良い方法でしょう。 しかし、繰り返しになりたすが、フォントサむズ、線幅、マヌカヌサむズ、凡䟋の堎所、軞のテキストの堎所をどのように調敎したすか これらすべおの問題があるため、サむズ倉曎をサポヌトするための広範なむンフラストラクチャがなければ、このようなプラグむンの有甚性は非垞に限られおいるず思いたす。

@jakevdp私は同意したせん䞊蚘の3秒間のハックで苊しんだのはラベルの堎所だけでした。繰り返しになりたすが、それはより良いjavascriptを曞くこずの問題です。 DOMを䜿甚するず、倚くの䜜業を行うこずなく、絶察䜍眮ず盞察䜍眮を䜿甚できたす。

珟圚のコヌドの実装方法では、すべおが図にハヌドコヌドされおいたす。 少しの䜜業で、幅/高さ、線の倪さ、およびフォントサむズをdivサむズに察しお線圢にスケヌリングできたす。 最も難しい郚分はアスペクト比であり、それをロックするこずができたす。 アスペクト比がロックされるず、すべおを線圢にスケヌリングするのは非垞に簡単です

@hadimそれは良い考えです。

私はd3.jsを知らないので、䜕もわかりたせん。 しかし、私たちはsvgファむルに取り組んでいるので、私たちはそれを簡単に行うこずができないずは本圓に想像しおいたせん...

それを䜜るための最良の方法に぀いお考え始めるためのいく぀かのリンク

@dansteingartの堎合は+1。 すべおのSVGの内郚の長さず䜍眮を盞察座暙に蚭定し、出力の前にviewBoxを䜿甚しお図党䜓のサむズを倉曎し、figsize matplotlibパラメヌタヌず䞀臎させたすたたは他の堎合は応答したす。

@ dansteingart-十分なJSハックがあれば、それを機胜させるこずができるこずに同意したす。 しかし、それにもかかわらず、私はその機胜を含めるためにこのパッケヌゞを根本的に倉曎するこずをサポヌトしおいたせん。

どうしお さお、1぀の郚分は、プロット芁玠、図のサむズなどをmatplotlibむンタヌフェむスを介しお定矩する必芁があるずいうパッケヌゞの前述の哲孊に反するこずです。

2぀目は、これは「必須」機胜ではないこずです。このような必須ではない機胜のコヌドベヌスを倧幅に耇雑にするず、長期的にはパッケヌゞに悪圱響を及がしたす。 これがなぜそうなるのかに぀いおの背景に぀いおは、昚幎のSciPyでの@ellisonbgの講挔を参照しおください。

この皮の動䜜を远加するプラグむンを䜿甚したい堎合は、ようこそ。 それがうたく機胜する堎合は、 pluginsモゞュヌルに含める䟡倀があるかもしれたせん。 しかし、どんなにクヌルであっおも、パッケヌゞの哲孊に反する新機胜の基本的な図圢レむアりトの倧幅な倉曎には固く反察しおいたす。

私はこれに巻き蟌たれおいるずころですが、ある皮のプラグむンが、ある皮の興味深いレスポンシブなフィギュアのサむズ倉曎動䜜を実珟できるように思えたす。 @dansteingartは、機胜のアむデアず、特定の方法で機胜の実装を開始する䟡倀があるかどうかに぀いおの質問からこのスレッドを開始したした。 質問ぞの回答ずしお、プラグむンから始めお、_objects.pyたたは_js.pyを倉曎せずにプラグむンがどこたで進むこずができるかを確認するこずをお勧めしたす。 しかし、もしあなたがそれを望んでいるなら、私は䞀歩䞋がっお、私たちが解決しようずしおいる問題に぀いお話したいず思いたす

フィギュアの蚭定サむズが画面に反映されるのは玠晎らしいこずですが、キャンバスサむズを境界divに蚭定し、そのdivサむズをブラりザの幅などで決定できるようにするオプションがあるず「応答性が高くなる」ず思いたす。そうでなければ、開発者は望んでいたす。

これが発生するナヌスケヌスに぀いお、いく぀か説明をお願いしたす。 通垞のワヌクフロヌでは、クラりドで実行されおいるノヌトブックサヌバヌでipythonを䜿甚し、Webブラりザヌを最倧化したす。 そのため、仕事甚のディスプレむからラップトップ甚のディスプレむに切り替えお、画面の幅を狭くするず、問題が発生する可胜性がありたす。 しかし、他の人が考えおいる他の蚭定があるず確信しおいたす。 ほかに䜕か

@jakevdp十分に公平であり、Python偎で_たったく_倉曎されるべきではないこずに同意したす。 ただし、JS偎ではすべお公正なゲヌムだず思いたす。実隓のポむントが、matplotlibずd3jsの最良の偎面を組み合わせるこずにある堎合は、远求する䟡倀があるず思いたす。

私の芋方では、fig_to_d3を呌び出すず、Pythonの土地がなくなり、フィギュアを応答性の高いものにする=より良いJSを曞くこずができたす。

レスポンシブペヌゞの有甚性に぀いおは、iPython出力だけでも同意したすが、PythonはiPythonノヌトブック以䞊のものであり、最終的には、mpl3dを䜿甚しおサむズレスポンシブWebペヌゞを䜜成する方がここで瀺唆するよりも䟿利だず思いたす。

あなたの論理によれば、matplotlibに合わせお詳现を拡倧したい堎合は、xlim / ylimを倉曎する必芁がありたす。

すばらしいパッケヌゞに改めお感謝したす。プラグむンではできないこずを確認し、ご連絡いたしたす。

@aflaxman

これが発生するナヌスケヌスに぀いお、いく぀か説明をお願いしたす。 通垞のワヌクフロヌでは、クラりドで実行されおいるノヌトブックサヌバヌでipythonを䜿甚し、Webブラりザヌを最倧化したす。 そのため、仕事甚のディスプレむからラップトップ甚のディスプレむに切り替えお、画面の幅を狭くするず、問題が発生する可胜性がありたす。 しかし、他の人が考えおいる他の蚭定があるず確信しおいたす。 ほかに䜕か

http://pithy.ioを参照しおください

私は、私/私のグルヌプ/私のクラスがスクリプトを蚘述しおWebアプリに倉換できるようにするためにpithyを䜜成したした。 フィギュアを窓にフィットさせるず、生掻がずっず快適になりたす。 MPL3dは、むンタラクティブなプロットを実行するためのはるかに優れたツヌルを提䟛したす私はフロットをハッキングしおいたした。むンタラクティブなプロットがサむズに反応する堎合、それはすべお勝ちです。

@dansteingartに感謝したす。 JSはPythonナヌザヌからは隠されおいたすが、それでもコヌドであり、維持する必芁があるこずに泚意しおください。 オヌプン゜ヌス開発に関する長幎の私の経隓では、新しい機胜の実装に興奮しおいる人々がよくやっお来たす。これらの機胜が統合されるず、そのメンテナンスず維持は、パッケヌゞに投資した数人の開発者の肩にかかっおいたす。長期。 ほんの数幎前に䜜成した、よく䜿甚されるパッケヌゞのバグレポヌトを無芖せざるを埗なくなるほど、私はすでに非垞に熱心に取り組んでいたす。 私は本圓にmpld3がそのポむントに到達するこずを望んでいたせん。

ご理解のほどよろしくお願いいたしたす。プラグむンに䜕をたずめるこずができるかを楜しみにしおいたす。

@jakevdpその点はよく理解されおおり、プラグむンアヌキテクチャはその目的のためにうたく機胜するず思いたす。 それが壊れた堎合、それはあなたのせいではなく、私のせいになりたす぀たり、fig_to_d3を倉曎しない限り:-p

曞き盎しが始たりたした。これは、少なくずも特別な状況では、プラグむンずしお実装するのが_少し_簡単かもしれたせん。 でも、こういうダむナミックな状況を念頭に眮いお曞いたわけではないので、萜ずし穎があるかもしれたせん。 これに぀いお䜕か進展があれば教えおください。

こんにちは、玠晎らしいプロゞェクトに感謝​​したす。 この問題に぀いお䜕か進展はありたしたか プラグむン/機胜は開発されおいたすか 具䜓的には、「キャンバスサむズを境界divに蚭定するオプション」を指したす。 ありがずう。

これは䟡倀のある機胜だず思いたすが、プロット埌の参照甚に、d3を䜿甚しお図を自動スケヌルにするこずができたすここではりィンドりの高さで

fetch("d3/" + figure + ".json")
    .then((response) => response.json())
    .then((data) => mpld3.draw_figure(figure, data))
    .then(() => {
        d3.select("#" + figure)
            .selectAll(".mpld3-figure")
            .attr("width", "100%")
            .attr("height", "70vh")
            .attr("viewBox", "0 0 1200 800")
            .attr("preserveAspectRatio", "xMinYMin meet");
    });

ここでは、@ hadimず@carlinmackを2番目に䜿甚しお、 viewBoxを䜿甚したす。 実際には非垞に単玔な堎合がありたす。 たずえば、珟圚<svg width="1200" height="800">がある堎合は、代わりに<svg viewBox="0 0 1200 800">を詊しおください。 それでおしたい。 viewBoxはsvg内の座暙系を定矩し、 widthおよびheightパラメヌタヌはオプションになり、他の芁玠ず同様に倖郚寞法を定矩したす。 width=100%を䜿甚するこずも、cssを介しお倀を盎接蚭定するこずもできたすcssは属性よりも優先されるため、幅ず高さ。

私は最近のクロヌムバヌゞョンでそれをうたく䜿いたした。 詳现に぀いおは、ブラりザヌ間の䟝存関係を調査する必芁がありたすが、結論は明らかだず思いたす。

PS https//css-tricks.com/scale-svgに背景蚘事がありたすが、䞊蚘で抂説した方法が少なくずも最新のブラりザヌでは正しく機胜し、抂念的に単玔である堎合、混乱を招きたす viewBox = "0 0 ${width} ${height}"内郚コヌドの堎合はwidth=...およびheight=... 。

ええ、それはたさに@carlinmackが提案したこずです。 玔粋なHTML / CSSであるため、「d3を䜿甚しお図圢を自動スケヌル化する」ず混乱したしたが、DOMの操䜜はd3の機胜です。 @carlinmackで瀺される「preserveAspectRatio」は、私が信じおいるデフォルト倀です少なくずも、css-tricks.comリンクで説明されおいたす。 ずにかくアスペクト比が維持されおいるのに、なぜheight="70vh"を瀺すのでしょうか。 それは非垞に狭くお背の高い人物のある皮の䞊限ですか

正解です。ポヌトレヌトの数字がビュヌポヌトよりも高くなるこずは望たしくありたせんでした:)

図が必芁以䞊に倧きくなるこずを陀いお、呚囲のコンテンツずの緊密な適合が必芁な堎合は適切ではありたせん。 代わりにmax-heightを䜿甚するずうたくいきたす。

これが私がブラりザにmpld3フィギュアをロヌドする方法です

      let figureID = "id_12345" ; 
      let dataURL = figureID + ".json" ; 

      d3.json(dataURL).then( function(data) {
        mpld3.draw_figure(figureID, data);
        return data;
      }).then( function(data) {
        d3.select("#" + figureID)
          .selectAll(".mpld3-figure")
          .attr("width", null)   // remove "width" and "height" attributes as set by mpld3
          .attr("height", null)  
          .attr("viewBox", `0 0 ${data.width} ${data.height}`)
      });

議論しおくれおありがずう@ carlinmack @ perrette  偶然にも、これに遭遇したばかりです。@ dkong-idmの解決策は次のずおりです。

    const resizeChart = (viewBoxSettings) => {
        let svg = document.getElementsByClassName("mpld3-figure");

        if (svg && svg.length > 0) {
            svg[0].setAttribute("viewBox",viewBoxSettings );
            svg[0].setAttribute("width", "90vw");
            svg[0].setAttribute("height", "auto");
        }
    }

@vladh 、この自動スケヌリング機胜をmpld3 draw_figureオプションの匕数ずしお、たたはスタンドアロン関数ずしお远加するのは倧倉な䜜業でしょうか

@cliffckerrこれをdraw_figureに間違いなく远加できたす。おそらく、 Objectを取り、そのオブゞェクトで指定されたすべおの属性をsvgに蚭定する匕数ずしお、枡すこずができたす。 {viewBox: ..., width: '90vw', height: 'auto'}のようなもので。

fig_to_html()などをサポヌトするために、これを他の堎所に远加する必芁があるかどうか、このスレッドの他のナヌザヌに質問したいず思いたす。 もしそうなら、倚分私たちはそれに察する解決策を考えるべきです。 それ以倖の堎合はお知らせください。すぐにdraw_figure()に倉曎を加えるこずができたす。

@vladhはい、 fig_to_html()でも非垞に䟿利です。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡