2

我有一个带有单个 QBarSet 的水平条形图,如下所示: 在此处输入图像描述

我想单独设置 QBarSet 的每个条的颜色。有什么办法可以做到吗?

我知道我可以使用 3 个单独的 QBarSet 而不是一个,并分别设置每个 QBarSet 的颜色以实现我想要的。但是,我不想使用这种策略,因为条形图的标签会出现在图表顶部的图例中(我希望每个条形图的标签出现在条形图的左侧,就像在快照中一样我提供)。

我在这里看到了一个解决方案,它解释了如何在悬停事件上执行此操作,但我可以找到一种方法来修改该解决方案,以便条形始终是彩色的。

谢谢!

4

2 回答 2

2

以下方法在另一种配置中可能会失败,因为它高度依赖于图表上放置的内容,因此如果您想回答您的实际问题,您必须提供 MRE。

考虑到上述情况,逻辑是通过过滤器获取项目(矩形)并设置颜色:

#include <random>

#include <QApplication>
#include <QtCharts>
QT_CHARTS_USE_NAMESPACE

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QChartView w;

    QBarSet *set0 = new QBarSet("bar1");

    *set0 << 1 << 4 << 3 << 7 << 2 << 5 << 1 << 3 << 3 << 2 << 1 << 6 << 7 << 5;

    QBarSeries *series = new QBarSeries;
    series->append(set0);

    QChart *chart= new QChart;
    w.setChart(chart);
    chart->addSeries(series);

    // filter items
    QList<QGraphicsRectItem *> rect_items;
    for(QGraphicsItem * it : w.items()){
        if(QGraphicsRectItem *rect = qgraphicsitem_cast<QGraphicsRectItem *>(it)){
            if(rect->parentItem() != chart && rect->parentItem()->parentItem() == chart){
                rect_items << rect;
            }
        }
    }

    // change color
    std::random_device dev;
    std::mt19937 rng(dev());
    std::uniform_int_distribution<std::mt19937::result_type> dist255(0, 255);

    for(QGraphicsRectItem * rect : rect_items){
        QColor color(dist255(rng), dist255(rng), dist255(rng));
        rect->setBrush(color);
    }

    w.show();

    return a.exec();
}

在此处输入图像描述

于 2019-11-07T05:38:22.237 回答
1

我知道我可以使用 3 个单独的 QBarSet 而不是一个,并单独设置每个 QBarSet 的颜色以实现我想要的。但是,我不想使用这种策略,因为条形图的标签会出现在图表顶部的图例中(我希望每个条形图的标签出现在条形图的左侧,就像在快照中一样我提供)。

刚刚以同样的意图与这个挑战搏斗,我最终使用了一个 QStackedBarSeries 和单独的 QBarSet 实例,这些实例使用虚拟零值来使每个绘制的条具有不同的颜色,根据图表主题。显然,同样的技巧可以用于每个条形集的手动着色。

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QStringList names;
    names << "Parti Conservateur" << "Parti Liberal" << "Parti Vert";
    QList<qreal> counts;
    counts << 41 << 36.3 << 22.7;

    auto series = new QHorizontalStackedBarSeries();
    QList<qreal> dummyCount;
    for(int i = 0; i < names.count(); ++i) {
      auto barSet = new QBarSet(names.at(i));
      // to "trick" the bar chart into different colors, each new group
      // must be in a different value position so replace the previous
      // value with 0 and insert the next one
      if(i > 0) dummyCount.replace(i-1, 0);
      dummyCount << counts.at(i);
      barSet->append(dummyCount);
      series->append(barSet);
    }
    series->setLabelsVisible(true);
    series->setLabelsFormat(QStringLiteral("@value%"));
    series->setLabelsPosition(QAbstractBarSeries::LabelsInsideEnd);

    auto chart = new QChart();
    chart->addSeries(series);
    chart->legend()->hide();

    auto axisY = new QBarCategoryAxis();
    axisY->append(names);
    chart->addAxis(axisY, Qt::AlignLeft);
    series->attachAxis(axisY);
    auto axisX = new QValueAxis();
    chart->addAxis(axisX, Qt::AlignBottom);
    series->attachAxis(axisX);
    axisX->applyNiceNumbers();

    QChartView chartView;
    chartView.setChart(chart);
    chartView.show();

    return a.exec();
}

不同颜色的堆积条形图

于 2020-12-29T19:22:15.940 回答