m0_37670973 2024-09-25 15:21 采纳率: 16.7%
浏览 4
已结题

QChart横向叠加柱状图,数据量大时,Y轴刻度显示不全

QChart横向叠加柱状图,数据量大时,Y轴刻度显示不全

img

QColor GREEN = QColor(0, 230, 0);
QColor RED = QColor(255, 50, 50);

QHorizontalStackedBarSeries *series = new QHorizontalStackedBarSeries();
series->setBarWidth(0.5);

for(int i=0; i < 100; i++) {
    if (i%4==0) {
        *set0 << 0;
        *set1 << 0;
        continue;
    }
    *set0 << 1 + QRandomGenerator::global()->bounded(4.1);
    *set1 << 2+ QRandomGenerator::global()->bounded(1.1);
}

series->append(set0);
series->append(set1);

set0->setColor(GREEN);
set1->setColor(RED);
set0->setBorderColor(GREEN);
set1->setBorderColor(RED);

series->setUseOpenGL(true);

connect(series, SIGNAL(hovered(bool, int, QBarSet*)), this, SLOT(sltTooltip(bool, int, QBarSet*)));

QChart *chart = new QChart();

chart->addSeries(series);
chart->setTitle("Simple horizontal stacked barchart example");
chart->setAnimationOptions(QChart::SeriesAnimations);

QStringList categories;
for(int i=20; i< 120; i++) {
    if (i%20==0) {
        categories << "";
        continue;
    }
    categories << QString::number(i);
}

QBarCategoryAxis *axisY = new QBarCategoryAxis();
axisY->append(categories);
chart->addAxis(axisY, Qt::AlignLeft);
axisY->setTitleVisible(true);
axisY->setVisible(true);
series->attachAxis(axisY);

QValueAxis *axisX = new QValueAxis();

chart->addAxis(axisX, Qt::AlignBottom);
series->attachAxis(axisX);

chart->legend()->setVisible(false);
chart->legend()->setAlignment(Qt::AlignBottom);
chart->setTitle("");

QChartView *chartView = new QChartView(chart);
chartView->setRenderHint(QPainter::Antialiasing);
chartView->setStyleSheet("background-color:black");
  • 写回答

2条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    解决方案:

    1. 使用auto layout:在创建图表之前,为每一列添加布局。这将确保即使你的图表被折叠或展开,它们的宽度和高度也会正确地保持不变。
    2. 使用自定义窗口大小:通过更改窗口大小,可以控制图表的位置和大小。如果你知道每个轴应该占据多少空间,你可以使用这个设置来调整图表的大小。
    3. 将高度设置为自动:如果数据显示过多,可能需要考虑将Y轴的高度设置为最大值以避免高度不足的问题。

    以下是基于上述解决方案的一段示例代码:

    // 创建一个矩形窗口,用于存储图表
    QMainWindow *mainWindow = new QMainWindow(this);
    setCentralWidget(mainWindow);
    
    // 添加一个自定义布局,以确定每一列的大小
    QGridLayout *layout = new QGridLayout();
    layout->verticalSpacing(10);
    layout->horizontalSpacing(20);
    for(int column = 0; column < 3; column++) {
        // 设置每一列的高度为固定值,具体取决于每一列的宽度
        for(int row = 0; row < 4; row++) {
            layout->setColumn(row, column, 100);
        }
    }
    
    // 设置窗体标题和水平堆叠柱状图
    set.setWindowTitle("Vertical Stacked Bar Chart Example");
    set_ylabel("Data");
    
    // 在主窗口中添加图表和布局
    QChart *chart = new QChart();
    chart->addSeries(new QHorizontalStackedBarSeries());
    chart->setTitle("Vertical Stacked Bar Chart Example");
    chart->setAnimationOptions(QChart::Seriesanimations);
    int xMin = 0;
    int xMax = 800;
    int yMin = 0;
    int yMax = 50;
    
    for(int i = 0; i < 100; i++) {
        series->append(set0);
        series->append(set1);
        series->attachAxis(axisY);
        series->setYValues(xMin, xMax, yMin, yMax);
        axisY->setValue(i, i, 0);
    }
    
    chart->setParameters({{"xMin", xMin}, {"xMax", xMax}, {"yMin", yMin}, {"yMax", yMax}});
    chart->addAxis(axisX);
    chart->setValue(0, 0, 100, chart->yMax() - chart->yMin());
    
    // 绘制图表
    chartView->addChart(chart);
    chartView->show();
    

    这段代码首先创建了一个矩形窗口,并在其中添加了一个自定义布局。然后,它设置了窗体标题和水平堆叠柱状图,并为每一列指定了固定的高度。最后,它绘制了图表,并将其添加到窗口中。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 9月26日
  • 创建了问题 9月25日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?