@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        final int height = getMeasuredHeight();
        final int width = getMeasuredWidth();

        final int heightAfterPadding = height  - mSectionPadding * SECTION_COUNT - (SECTION_COUNT * COLUMNS_PER_SECTION - 1) * mColumnPadding;
        final int columnHeight = heightAfterPadding / (SECTION_COUNT * COLUMNS_PER_SECTION);

        float[] maxTimings = new float[SECTION_COUNT];
        for (int sectionIndex = 0; sectionIndex < SECTION_COUNT; sectionIndex++) {
            Section section = mSections[sectionIndex];
            float maxMs = 0;
            for (Column column : section.columns) {
                maxMs = Math.max(maxMs, column.getMedianTiming());
            }
            maxTimings[sectionIndex] = maxMs;
        }

        int currentY = mSectionPadding;
        for (int sectionIndex = 0; sectionIndex < SECTION_COUNT; sectionIndex++) {
            Section section = mSections[sectionIndex];

            canvas.drawLine(0, currentY - mDividerHeight, width, currentY, mTextPaint);
            canvas.drawText(section.title, mTextPadding, currentY - mTextPaint.descent(), mTextPaint);

            float maxMs = maxTimings[sectionIndex];
            if (maxMs > 0) {
                for (int columnIndex = 0; columnIndex < COLUMNS_PER_SECTION; columnIndex++) {
                    Column column = section.columns[columnIndex];
                    int columnWidth = (int)(width * column.getMedianTiming() / maxMs);
                    canvas.drawRect(0, currentY, columnWidth, currentY + columnHeight, mPaints[columnIndex]);

                    String columnTitle = column.getTitle();
                    if (!TextUtils.isEmpty(columnTitle)) {
                        mTextPaint.getTextBounds(columnTitle, 0, columnTitle.length(), mTextBounds);
                        canvas.drawText(columnTitle, mTextPadding, currentY + columnHeight / 2 - mTextBounds.exactCenterY(), mTextPaint);
                    }

                    currentY += columnHeight + mColumnPadding;
                }
                currentY += mSectionPadding;
            }
        }
    }
Hacked together barchart view for this demo. Please do not take this as an example of a good way to do things.
BenchmarkDemo/app/src/main/java/com/bluelinelabs/logansquare/demo/widget/BarChart.java