Building on Tomasz Janeczko, Anderson Wilson and Beppe's code and ideas, I came up with the following AFL that shows the percentage of volume in the various rectangles representing the close in the candle thirds. Select the range required for the VAP by double clicking on the chart for your desired start and end candle. Double click on the blank region (right) to revert to all visible bars.

Here is the AFL:
/*
Author: Anderson Wilson, Beppe, Steve Walsh
based on PriceVolDistribution demo written by Tomasz Janeczko
Volume-by-Price is an indicator that shows the amount of volume for a particular price range,
The Volume-by-Price bars are horizontal and shown on the left side of the chart to correspond
with these price ranges. Bar colors indicate Bull (SeaGreen) / Bear (Custom16) / Total (Grey40) volume
Use double click to define range.
*/
SetChartOptions( 0, chartShowArrows | chartShowDates );
GraphXSpace = 15;
//
Plot( C, "", colorAqua, styleCandle );
Title = GetFnData( "Alias" ) + " - " + StrFormat( "{{FULLNAME}} - {{INTERVAL}}: {{DATE}}, VAP Absolute Values, Open %g, Hi %g, Lo %g, Close %g (%.1f%%), Vol(mil) %.2f (%.0f%%) {{VALUES}}", O, H, L, C, SelectedValue( ROC( C, 1 ) ), V / 1000000, SelectedValue( ROC( V, 1 ) ) );
//
bi = BarIndex();
fvb = BeginValue( bi );
lvb = EndValue( bi );
if( fvb == 0 && lvb == LastValue( bi ) )
{
fvb = FirstVisibleValue( bi );
lvb = LastVisibleValue( bi );
}
fvb = Max( 0, fvb );
lvb = Max( 0, lvb );
bins = Param( "Bins", 10, 3, 100, 1 );
pRecHeight = Param( "Rectangle Height", 0.90, 0.10, 1, 0.05 );
BullBearZone = ( High - Low ) / 3;
bullbar = C > ( High - BullBearZone );
bearbar = C < ( Low + BullBearZone );
// mx = [row 0][col 0]
// price levels in first column [0][0] and relative volume at that level in second column [0][1]
// https://www.amibroker.com/guide/afl/pricevoldistribution.html
mx = PriceVolDistribution( H, L, V, bins, True, fvb, lvb );
mx1 = PriceVolDistribution( H, L, IIf( bullbar, V, 0 ), bins, True, fvb, lvb );
mx2 = PriceVolDistribution( H, L, IIf( bearbar, V, 0 ), bins, True, fvb, lvb );
bins = MxGetSize( mx, 0 );
bins1 = MxGetSize( mx1, 0 );
bins2 = MxGetSize( mx2, 0 );
GfxSetOverlayMode( 1 );
GfxSetCoordsMode( 1 );
if( bins > 1 && bins == bins1 && bins == bins2 )
{
MaxVolume = mx[ 0 ][ 1 ];
// find max volume
for( i = 1; i < bins; i++ )
{
if( mx[ i ][ 1 ] > MaxVolume )
MaxVolume = mx[ i ][ 1 ]; // Volume for that bin 1...
//printf( "mx=%g", MaxVolume / 100000 );
}
// rectangle height
RecHeight = ( mx[ 1 ][ 0 ] - mx[ 0 ][ 0 ] ) / 2 * pRecHeight;
GfxSelectFont( "Arial", 7 ); // Change the text size here
for( i = 0; i < bins; i++ )
{
// mx1 = Bull
price = mx1[ i ][ 0 ]; // price level
absVolume = mx1[ i ][ 1 ];
VolAcum = absVolume;
relvolume = absVolume / MaxVolume;
relbar = relvolume * ( lvb - fvb + 1 );
// upper left corner of the rectangle.
x1 = fvb;
y1 = price + RecHeight;
// lower right corner of the rectangle.
x2 = fvb + relbar;
y2 = price - RecHeight;
bullColor = ColorBlend( colorSeaGreen, GetChartBkColor(), 0.2 );
GfxFillSolidRect( x1, y1, x2, y2, bullColor );
GfxSetBkColor( bullColor );
GfxSetTextColor( colorBrightGreen );
GfxTextOut( NumToStr( round( relvolume * 100 ), 2.0 ) + "%", x1, y1 );
// mx2 = Bear
absVolume = mx2[ i ][ 1 ];
VolAcum += absVolume;
relvolume = absVolume / MaxVolume;
relbar2 = relvolume * ( lvb - fvb + 1 );
x1 = x2;
x2 = x1 + relbar2;
bearColor = ColorBlend( colorCustom16, GetChartBkColor(), 0.2 );
GfxFillSolidRect( x1, y1, x2, y2, bearColor );
GfxSetBkColor( bearColor );
GfxSetTextColor( colorRed );
GfxTextOut( NumToStr( round( relvolume * 100 ), 2.0 ) + "%", x1, y1 );
// mx = All Bars
absVolume = mx[ i ][ 1 ];
relvolume = ( absVolume - VolAcum ) / MaxVolume;
relbar3 = relvolume * ( lvb - fvb + 1 );
x1 = x2;
x2 = x1 + relbar3;
midColor = ColorBlend( colorGrey40, GetChartBkColor(), 0.2 );
GfxFillSolidRect( x1, y1, x2, y2, midColor );
GfxSetBkColor( midColor );
GfxSetTextColor( colorBlack );
GfxTextOut( NumToStr( round( relvolume * 100 ), 2.0 ) + "%", x1, y1 );
}
}