d3のx軸テキストを回転します


81

私はd3とsvgのコーディングに不慣れで、グラフのxAxis上でテキストを回転させる方法を探しています。私の問題は、通常、xAxisのタイトルが棒グラフの棒よりも長いことです。そのため、テキストを回転させて、xAxisの下で(水平ではなく)垂直に実行することを検討しています。

変換属性を追加してみました:.attr( "transform"、 "rotate(180)")

しかし、そうすると、テキストが完全に消えてしまいます。svgキャンバスの高さを上げようとしましたが、それでもテキストを表示できませんでした。

私が間違っていることについての考えは素晴らしいでしょう。xとyの位置も調整する必要がありますか?そして、もしそうなら、どれだけ(Firebugでそれを見ることができるときにトラブルシューティングするのは難しい)。

回答:


166

回転(180)の変換を設定すると、テキストアンカーではなく、原点を基準にして要素が回転します。したがって、テキスト要素にそれらを配置するためのx属性とy属性も設定されている場合は、テキストを画面外に回転させた可能性があります。たとえば、試した場合、

<text x="200" y="100" transform="rotate(180)">Hello!</text>

テキストアンカーは⟨-200,100⟩になります。テキストアンカーを⟨200,100⟩のままにしておきたい場合は、変換を使用してテキストを回転する前に配置し、原点を変更できます。

<text transform="translate(200,100)rotate(180)">Hello!</text>

もう1つのオプションは、オプションのcx引数とcy引数をSVGのrotate変換に使用して、回転の原点を指定できるようにすることです。これは少し冗長になりますが、完全を期すために、次のようになります。

<text x="200" y="100" transform="rotate(180,200,100)">Hello World!</text>

さて、これは完璧です。ありがとう、マイク。これは(ほとんど)私がする必要があるすべてを行います。しかし、問題は、変数の長さに基づいてy位置を自動的に変更するにはどうすればよいかということです。ベースラインを<textfont-size = "12px" transform = "translate(20,170)rotate(-90)"> title 1 </ text>として設定した場合。それはいいです。ただし、次のタイトルが長いと言って、グラフと重ならないようにし、xAxisとグラフ自体の間のスペースを最小限に抑えたいと思います。
jschlereth 2012年

1
質問に回答した場合は、チェックボックスを追加して質問に回答済みのマークを付けてください。追加の質問がある場合は、新しい質問を作成してください。テキストの配置を設定するためのtext-anchor属性、またはテキストのベースラインを設定するためのdy属性について質問しているのではないかと思います。
mbostock 2012年

3
了解しました... text-anchor = 'end' <text text-anchor = "end" transform = "translate(20,130)rotate(-90)"> title1 </ text>助けてくれてありがとう、マイク。あなたはロック!
jschlereth 2012年

44

恥知らずに他の場所から引き抜かれました、すべて著者の功績です。

下マージンを示すためだけに含まれるマージンを増やす必要があります。

var margin = {top: 30, right: 40, bottom: 50, left: 50},

svg.append("g")
   .attr("class", "x axis")
   .attr("transform", "translate(0," + height + ")")
   .call(xAxis)
     .selectAll("text")  
     .style("text-anchor", "end")
     .attr("dx", "-.8em")
     .attr("dy", ".15em")
     .attr("transform", "rotate(-65)");

2

この回転するD3軸ラベルの問題の1つは、軸をレンダリングするたびにこのロジックを再適用する必要があることです。これは、軸が目盛りとラベルをレンダリングするために使用するenter-update-exit選択にアクセスできないためです。

d3fcは、コンポーネントで使用される基になるデータ結合にアクセスできるようにするデコレーションパターンを持つコンポーネントライブラリです。

D3軸のドロップイン置換があり、軸ラベルの回転は次のように実行されます。

var axis = fc.axisBottom()
  .scale(scaleBand)
  .decorate(function(s) {
    s.enter()
        .select('text')
        .style('text-anchor', 'start')
        .attr('transform', 'rotate(45 -10 10)');
  });

回転は入力選択にのみ適用されることに注意してください。

ここに画像の説明を入力してください

このパターンのその他の考えられる使用法は、軸のドキュメントページで確認できます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.