を使って円グラフを表示していVictoryPie
ます。ラベルが奇妙に重なり合っているので、VictoryLegend だけを使用したいと思います。この例を見つけましたjsfiddle
: https://jsfiddle.net/boygirl/1Lu96jq0/
jsfiddle の例ではcolorScale
、次のように 内で色を指定しています。colorScale={["tomato", "orange", "gold"]}
ただし、私の円グラフは動的であり、ユーザーの入力に依存するため、必要な色数を予測できません。VictoryPie で行うように、VictoryLegend 内で試しcolorScale="blue"
てみました。円グラフは正しいですが、凡例のラベルはすべて黒です。余談ですが、私の実装のラベルも、例のように縦に積み上げて表示されるのではなく、ページ全体に横に広げて表示されます。
私のレンダリングは次のようになります。
render() {
const {
data,
pieChartData,
beyondBudget,
showResults,
total,
pieLegend
} = this.state;
const questions = data.questions;
return (
<div>
{questions.map((q, i) => (
<UL key={i}>
<li>
<h4>{q.text}</h4>
</li>
<li>
<Options
state={this.state}
q={q}
i={i}
handler={this.handleInputChange}
/>
</li>
</UL>
))}
<button onClick={this.computeTotals}>Click</button>
{console.log("trying the keys approach", this.state.pieLegend)}
{this.state.showResults &&
(<div>
<VictoryLegend
standalone={false}
colorScale="blue"
legendWidth={50}
title="Legend"
centerTitle
style={{ border: { stroke: "black" } }}
data= {this.state.pieLegend}
/>
<VictoryPie
colorScale="blue"
data={pieChartData}
labels={d => `${d.x}: ${d.y}%`}
style={{ parent: { maxWidth: '50%' } }}
/>
{Object.keys(beyondBudget).length > 0 && (
<div>
<Table>
<tbody>
<tr>
<th>Out of Budget</th>
</tr>
<BrokeBudget
beyondBudget={beyondBudget}
/>
</tbody>
</Table>
</div>
)}
</div>
)
}
</div>
);
}
}