6

我曾经VictoryChart实现一个饼图,它工作得很好......

render() {

    const data_distribution = this.state.pie_keys.map((d) => ({x:d, y:this.state.pie_data[d], label:d }));

    return (
      <div className="App">
        <div className="pie_wrapper">
          <VictoryPie
            labelComponent={<VictoryTooltip cornerRadius={0} />}   
            padAngle={0.5}
            innerRadius={100}
            width={400} height={400}
            style={{ 
              labels: { fontSize: 15, fill: "black"},
              data: {
                  fillOpacity: 0.9, stroke: "white", strokeWidth: 3
              }
            }}
            labelRadius={90}
            data = {data_distribution}
          />
        </div>
      </div>
    );
  }

需要注意的是,它data_distribution看起来简单如下......

data={[
    { x: "Fac of Engineering & Appl Sci", y: 8.557902403495994 },
    { x: "Faculty of Arts and Science", y: 53.775188152464196 },
    { x: "Faculty of Education", y: 13.085700412721534 },
    ...
    ...
  ]}

所以我想知道我是否可以为数据对象中的每一块饼图设置颜色。该文档指定...

色阶:“灰度”、“定性”、“热图”、“暖色”、“冷色”、“红色”、“绿色”、“蓝色”。VictoryPie 将按索引为每个切片分配颜色,除非它们在数据对象中明确指定。

这说你可以,但我不知道怎么做。我尝试了以下...

data={[
    { x: "Fac of Engineering & Appl Sci", y: 8.557902403495994, colorScale:"red" },
    { x: "Faculty of Arts and Science", y: 53.775188152464196, colorScale:"red" },
    { x: "Faculty of Education", y: 13.085700412721534, colorScale:"red" },
    ...
    ...
]}

这转化为...

const data_distribution = this.state.pie_keys.map((d) => ({x:d, y:this.state.pie_data[d], label:d, colorScale:"red"}));

但是,它们不会变红。我在网上找不到示例。这可能吗?

我知道我可以定义colorScale: {[...]},但这不是我要问的。我希望能够从数据对象中设置饼图的每一块。

4

6 回答 6

8

我知道这个问题已经“回答”了,但答案让我不满意。由于我来到这里并感到沮丧,因此我决定发布我的解决方案,希望其他人可以从中受益。

style您可以使用道具 覆盖单个切片的颜色:

<VictoryPie
  data={[
    { x: "Cats", y: 35 },
    { x: "Dogs", y: 40 },
    { x: "Birds", y: 55 }
  ]}
  style={{
    data: {
      fill: ({ y }) =>
        y > 49 ? 'green'
        : y > 39 ? 'yellow'
        : 'tomato'
    }
  }}
/>

在这种情况下,您根本不应该使用colorScale。我已经阅读了源代码,据我所知,这是在VictoryPie.

于 2018-10-31T19:08:22.197 回答
5

您可以根据数据派生填充颜色,但您必须提供该逻辑。您接受的答案基于 y 值应用颜色,但是您也可以在数据本身中指定颜色,只要您设置样式即可:

<VictoryPie
  data={[
    { x: "Cats", y: 35, yourAttribute: "#0000FF" },
    { x: "Dogs", y: 40, yourAttribute: "#00FF00" },
    { x: "Birds", y: 55, yourAttribute:"#FF0000" }
  ]}
  style={{
    data: {
      fill: (d) => d.yourAttribute
    }
  }}
/>
于 2019-02-28T00:37:18.227 回答
3

我手动添加了一个函数来随机生成尝试,如果这对你有帮助 `var stats = this.state.statistics;

var stat = this.state.statistic;
        if (stats.length>0) {
            if(this.colors.length<stats.length){
                for(let i=0;i<stats.length;i++){
                    this.colors.push(getRandomColor());
                }
            }
        }
        const color = ['#9167f1', '#f26893', '#99cfef', '#99ef9a'];
        const colors = this.colors;`

function getRandomColor() {
    var letters = '0123456789abcdef';
    var color = '#';
    for (var i = 0; i < 6; i++) {
        color += letters[Math.floor(Math.random() * 16)];
    }
    return color;
}
于 2018-08-07T08:14:57.997 回答
2

如果您知道数据渲染顺序,那么您可以按相同顺序使用颜色,它将自动按顺序使用颜色

<VictoryPie
  colorScale={["black", "red", "green", "#4cc9ff", "navy" ]}
  data={sampleData}
/>
于 2018-08-01T05:54:16.977 回答
1

我认为不是colorScale: "red", 你想要fill: "red"在数据对象中,因为 Victory 的 Slice 原语只是 svg<Path>元素。

于 2018-10-08T17:27:38.427 回答
1

对于当前版本

"victory": "^35.4.0",
"victory-native": "^35.3.1"

你可以做:

 <VictoryPie
        data={[
            { x: "Cats", y: 35, fill: "gold" },
            { x: "Dogs", y: 40, fill: "tomato" },
            { x: "Birds", y: 55, fill: "navy" }
        ]}
        style={{
            data: {
                fill: ({datum}) => datum.fill
            }
        }}
   />

https://formidable.com/open-source/victory/docs/common-props/#data

于 2020-12-02T12:42:26.090 回答