Compartilhar via


Adicionar cores aos visuais do Power BI

Este artigo descreve como adicionar cores aos visuais personalizados do Power BI e como manipular pontos de dados para um visual com cores definidas.

IVisualHost, a coleção de propriedades e serviços que interagem com o host visual, pode definir cores em visuais personalizados com o colorPalette serviço. O código de exemplo neste artigo modifica o visual SampleBarChart. Para obter o código-fonte do visual SampleBarChart, consulte barChart.ts.

Para começar a criar visuais, confira Desenvolver um visual de cartão circular do Power BI.

Adicionar cor a pontos de dados

Para representar cada ponto de dados em uma cor diferente, adicione a variável color à interface BarChartDataPoint, conforme mostrado no exemplo a seguir:

/**
 * Interface for BarChart data points.
 *
 * @interface
 * @property {number} value    - Data value for point.
 * @property {string} category - Corresponding category of data value.
 * @property {string} color    - Color corresponding to data point.
 */
interface BarChartDataPoint {
    value: number;
    category: string;
    color: string;
};

Usar o serviço de paleta de cores

O serviço colorPalette gerencia as cores usadas em seu visual. Uma instância do serviço colorPalette está disponível em IVisualHost.

Defina a paleta de cores no método update com o seguinte código:

constructor(options: VisualConstructorOptions) {
        this.host = options.host; // host: IVisualHost
        ...
    }

public update(options: VisualUpdateOptions) {

    let colorPalette: IColorPalette = host.colorPalette;
    ...
}

Atribuir cor a pontos de dados

Em seguida, especifique dataPoints. Neste exemplo, cada dataPoints inclui uma propriedade definida de valor, categoria e cor. dataPoints também pode incluir outras propriedades.

Em SampleBarChart, o método visualTransform faz parte do ViewModel do gráfico de barras. Como o método visualTransform itera os cálculos de dataPoints, é o lugar ideal para atribuir cores, como no seguinte código:


public update(options: VisualUpdateOptions) {
    ....
    let viewModel: BarChartViewModel = visualTransform(options, this.host);
    ....
}

function visualTransform(options: VisualUpdateOptions, host: IVisualHost): BarChartViewModel {
    let colorPalette: IColorPalette = host.colorPalette; // host: IVisualHost
    for (let i = 0, len = Math.max(category.values.length, dataValue.values.length); i < len; i++) {
        barChartDataPoints.push({
            category: category.values[i],
            value: dataValue.values[i],
            color: colorPalette.getColor(category.values[i]).value,
        });
    }
}

Em seguida, aplique dados de dataPoints no d3-selection barSelection dentro do método update:

// This code is for d3 v5
// in d3 v5 for this case we should use merge() after enter() and apply changes on barSelectionMerged
this.barSelection = this.barContainer
    .selectAll('.bar')
    .data(this.barDataPoints);

const barSelectionMerged = this.barSelection
    .enter()
    .append('rect')
    .merge(<any>this.barSelection);

barSelectionMerged.classed('bar', true);

barSelectionMerged
.attr("width", xScale.bandwidth())
.attr("height", d => height - yScale(<number>d.value))
.attr("y", d => yScale(<number>d.value))
.attr("x", d => xScale(d.category))
.style("fill", (dataPoint: BarChartDataPoint) => dataPoint.color)
.style("stroke", (dataPoint: BarChartDataPoint) => dataPoint.strokeColor)
.style("stroke-width", (dataPoint: BarChartDataPoint) => `${dataPoint.strokeWidth}px`);

this.barSelection
    .exit()
    .remove();

Próximas etapas