ZedGraph控件,饼图中加入“其它”块,记录项目中的实际实现
starnc的专栏 http://blog.csdn.net/starnc/archive/2009/02/17/389

当饼图的分块大于10块的时候,往往会显得很杂乱,标签可能会叠加到一起,所以应该在饼图中加入“其它”块,把那些top10分开表示,剩下的就可以放在“其它”块里,这样界面较美观,以下为代码实现

其中dataRowPro 为datatable中的datarow

private string m_strColumn = string.Empty;             // 显示该列的数字  
 
    private string m_strName = string.Empty;                // 显示列名  
 
 
 
   ArrayList dataRowProList = new ArrayList();  
   Hashtable htShowName = new Hashtable();   
  if (dataRowPro.Length > 10)     //当分类大于10的时候  
  {  
    for (int i = 0; i < dataRowPro.Length; i++)  
    {  
     dataRowProList.Add(Convert.ToDouble(dataRowPro[i][m_strColumn]));  
     htShowName.Add(dataRowProList[i], dataRowPro[i][m_strShowName].ToString().Trim());  
            }  
            dataRowProList.Sort();  
            for (int i = 0; i < dataRowProList.Count - 1; i++)  
            {  
                dataRowPro[i][m_strColumn] = dataRowProList[dataRowProList.Count - 1-i];  
                dataRowPro[i][m_strShowName] = htShowName[dataRowProList[dataRowProList.Count - 1 - i]].ToString();   
            }  
            double totals = 0.0;  
            for (int i = 0; i < 9; i++)  
            {  
                if (string.IsNullOrEmpty(dataRowPro[i][m_strColumn].ToString()) == true)  
                {  
                    dataRowPro[i][m_strColumn] = "0";  
                }  
                segment[i] = myPane.AddPieSlice(Convert.ToDouble(dataRowPro[i][m_strColumn]) / protypeTotal * 100, Color.Yellow, Color.Red, 450f, 0.1+i/50, dataRowPro[i][m_strShowName].ToString().Trim() + "(" + Math.Round(Convert.ToDouble(dataRowPro[i][m_strColumn]) / protypeTotal * 100, 2) + "%)");  
                totals += Convert.ToDouble(dataRowPro[i][m_strColumn]) / protypeTotal * 100;  
            }  
            totals = 100.00 - totals;  
            segment[9] = myPane.AddPieSlice(totals, Color.GreenYellow, Color.Red, 40f, 0.1, "其它" + "(" + Math.Round(totals, 2) + "%)");  
        }  
        else {  
            for (int i = 0; i < dataRowPro.Length; i++)  
            {  
                if (string.IsNullOrEmpty(dataRowPro[i][m_strColumn].ToString()) == true)  
                {  
                    dataRowPro[i][m_strColumn] = "0";  
                }  
                segment[i] = myPane.AddPieSlice(Convert.ToDouble(dataRowPro[i][m_strColumn]) / protypeTotal * 100, Color.FromArgb(ra.Next(2, 255), ra.Next(3, 235), ra.Next(4, 200)), Color.Red, 40f, 0.1, dataRowPro[i][m_strShowName].ToString().Trim() + "(" + Math.Round(Convert.ToDouble(dataRowPro[i][m_strColumn]) / protypeTotal * 100, 2) + "%)");  
            }  
        }  
        masterPane.AxisChange(); 

这是部分逻辑代码实现,只要实现了datarowpro,以下代码可直接用

CIO之家 www.ciozj.com 公众号:imciow
关联的文档
也许您喜欢