private void drawBarChart(IDrawContext context, Axis axisX, Axis axisY) { var plotBase = new PointF(context.PlotArea.Left, context.PlotArea.Top); //まずx=1の幅を求める float dx = 0; { const int mergin = 2; //マージン const float minWidh = 1f; //最低幅 var pX1 = new PointF(); setPhisicalPos(ref pX1, 1, 0, axisX, axisY, plotBase); //x=1の場所 dx = (pX1.X - plotBase.X - mergin); //1要素の幅(原点とx=1の差) if (dx <= minWidh) { dx = minWidh; //最低幅クリップ } } //全部描く for (var i = 0; i < items.Count; i++) { if (items[i].Value > 0) //ゼロは書かない { //箱座標 PointF pTop = new PointF(); setPhisicalPos(ref pTop, items[i].Key, items[i].Value, axisX, axisY, plotBase); var rect = new RectangleF(pTop.X - (dx / 2), pTop.Y, dx, context.PlotArea.Bottom - pTop.Y); //左端より出てる分を切り捨てる if (rect.Left < plotBase.X) { var sub = plotBase.X - rect.Left; rect.X = plotBase.X; rect.Width -= sub; } //右端より出てる分を切り捨てる if (rect.Right > context.PlotArea.Right) { rect.Width -= (rect.Right - context.PlotArea.Right); } //箱描画 context.DrawRect(rect, 1, Color, Color); } } }