I must be missing something very simple here . I would like to make a bar graph similar to the program below, but I would like the error bar colors to match the bar fills. When I try plotsetlinecolor(...)
right before the plotAddErrorBar()
, it only reads the first color. Thanks
// Create 2x1 numeric vectors seattle = { 47, 70 }; phoenix = { 68, 105 }; denver = { 32, 85 }; // Create 2x1 string labels labels = "January" $| "June"; // Declare 'myPlot' to be a plotControl struct // and fill with defaults settings for bar plots struct plotControl myPlot; myPlot = plotGetDefaults("bar"); // Create legend leg_text = "Phoenix" $| "Seattle" $| "Denver" $| ""; plotSetLegend(&myPlot, leg_text, "top left inside"); // Set legend border to zero pixels wide plotSetLegendBorder(&myPlot, "gray", 0); // Set Fill to two different fill patterns // and 100% opacity plotSetFill(&myPlot, 12|13, 1); // Use HTML to create the degrees symbol plotSetYLabel(&myPlot, "Temp °F"); // Concatenate temperature vectors // into a 2x2 matrix heights = phoenix ~ seattle ~ denver; // Draw the graph plotBar(myPlot, labels, heights); se = { 5 8, 8 10, 30 15 }; plotAddBoxErrorBars(labels, heights, se); proc (0) = plotAddBoxErrorBars(labels, heights, se); local box_xs; box_xs = calcBoxCenters(rows(labels), cols(heights)); plotAddErrorBar(box_xs, vec(heights), vecr(se)); endp; proc (1) = calcBoxCenters(nlabels, nboxes); local box_width, idx, x; box_width = 0.5; x = seqa(1, 1, nlabels); idx = seqa(x[1]-box_width/2+box_width/(nboxes*2), 2*box_width/(nboxes*2), nboxes); retp(vecr(idx+(x-1)')); endp;
1 Answer
0
To change the colors of the error bars, we need to pass a plotControl structure with the desired line color settings to plotSetErrorBar .
Since each set of error bars added with shares the same line color, we need to loop over each set of lines that we want to have a separate color and add the lines.
Here is the code from the example you posted that needs to be modified.
plotAddBoxErrorBars(labels, heights, se, myPlot.fillColor); proc (0) = plotAddBoxErrorBars(labels, heights, se, clrs); local box_xs, j; box_xs = calcBoxCenters(rows(labels), cols(heights)); heights = vec(heights); se = vecr(se); // Create new plotControl structure for loines struct plotControl plt; plt = plotGetDefaults("xy"); /* ** Each series of lines added shares the same color. ** So we loop and add the lines by color */ j = 1; for i(1, 6, 2); // Set the corresponding color plotSetLinePen(&plt, 1, clrs[j]); plotAddErrorBar(plt, box_xs[i:i+1], heights[i:i+1], se[i:i+1]); j = j + 1; endfor; endp;
Your Answer
1 Answer
To change the colors of the error bars, we need to pass a plotControl structure with the desired line color settings to plotSetErrorBar . Since each set of error bars added with shares the same line color, we need to loop over each set of lines that we want to have a separate color and add the lines.
Here is the code from the example you posted that needs to be modified.
plotAddBoxErrorBars(labels, heights, se, myPlot.fillColor); proc (0) = plotAddBoxErrorBars(labels, heights, se, clrs); local box_xs, j; box_xs = calcBoxCenters(rows(labels), cols(heights)); heights = vec(heights); se = vecr(se); // Create new plotControl structure for loines struct plotControl plt; plt = plotGetDefaults("xy"); /* ** Each series of lines added shares the same color. ** So we loop and add the lines by color */ j = 1; for i(1, 6, 2); // Set the corresponding color plotSetLinePen(&plt, 1, clrs[j]); plotAddErrorBar(plt, box_xs[i:i+1], heights[i:i+1], se[i:i+1]); j = j + 1; endfor; endp;