2011-05-25 29 views
6

Tôi đang sử dụng thư viện Biểu đồ trong .Net 4.0 để tạo biểu đồ cột xếp chồng lên nhau với một vài chuỗi. Mục tiêu của tôi là biểu đồ hiển thị số hành động tích lũy (số lần hoàn thành báo cáo) mỗi ngày trong một số chuỗi (giáo viên). Thường có dữ liệu bị thiếu (không có hoạt động vào ngày đó bởi một giáo viên cụ thể).Biểu đồ cột xếp chồng xếp hạng Microsoft có khoảng cách

tôi nhận được khoảng trống trong các quán bar khi có thiếu dữ liệu trong một loạt:

Histogram with gaps in the columns

Mã của tôi:

public ActionResult CompletionHistogram(int sid, int width, int height) 
    { 
     Site site = SiteRepository.Get(sid); 
     if (site == null) 
      return new HttpNotFoundResult(); 

     Chart chart = new Chart(); 
     chart.Height = height; 
     chart.Width = width; 
     ChartArea area = chart.ChartAreas.Add("Default"); 

     // Treat each teacher as a series 
     foreach (Teacher t in site.Teachers) 
     { 
      Series series = chart.Series.Add(t.FullName); 
      series.ChartType = SeriesChartType.StackedColumn; 
      series.Name = t.FullName; 

      // Group completions by day (filter out incomplete reports and null timestamps) 
      var groups = t.StudentReports 
       .Where<StudentReport>(rep => rep.IsComplete && rep.FirstSaveTimestamp.HasValue) 
       .GroupBy<StudentReport, DateTime>(rep => rep.FirstSaveTimestamp.Value.Date); 

      bool hasPoints = false; 
      foreach (var g in groups) 
      { 
       series.Points.AddXY(g.Key, g.Count()); 
       hasPoints = true; 
      } 

      series.IsValueShownAsLabel = true; 
      series.ToolTip = "#VALX"; 

      if (hasPoints) 
       chart.DataManipulator.InsertEmptyPoints(1, IntervalType.Days, series); 
     } 


     area.AxisX.LabelStyle.Format = "ddd M/d"; 
     return new ChartResult(chart); 
    } 

Làm thế nào tôi có thể loại bỏ các

Trả lời

9

Tôi có một cách để thực hiện công việc này.
Xin lỗi vì câu trả lời dài, nhưng tôi thấy cách bạn cố gắng thực hiện câu trả lời này sẽ ảnh hưởng đến nó nếu nó hoạt động hay không.

Bạn cần đặt điểm bằng 0 theo cách thủ công khi bạn thêm điểm. Lưu ý: Tôi không thể thực hiện công việc này bằng cách thêm các điểm không sau sự kiện.

Xem ví dụ bên cạnh và ảnh chụp màn hình kết quả: chart1.Series.Clear(); chart1.Series.Add (new Series()); chart1.Series.Add (new Series()); chart1.Series.Add (new Series()); chart1.Series.Add (new Series());

foreach (Series s in chart1.Series) 
{ 
    s.ChartType = SeriesChartType.StackedColumn; 
} 

//chart1.Series[0].Points.Add(new DataPoint(0, 0)); 
chart1.Series[0].Points.Add(new DataPoint(1, 3)); 
chart1.Series[0].Points.Add(new DataPoint(2, 3)); 
chart1.Series[0].Points.Add(new DataPoint(3, 3)); 

chart1.Series[1].Points.Add(new DataPoint(0, 3)); 
//chart1.Series[1].Points.Add(new DataPoint(1, 0)); 
chart1.Series[1].Points.Add(new DataPoint(2, 3)); 
chart1.Series[1].Points.Add(new DataPoint(3, 3)); 

chart1.Series[2].Points.Add(new DataPoint(0, 3)); 
chart1.Series[2].Points.Add(new DataPoint(1, 3)); 
//chart1.Series[2].Points.Add(new DataPoint(2, 0)); 
chart1.Series[2].Points.Add(new DataPoint(3, 3)); 

chart1.Series[3].Points.Add(new DataPoint(0, 3)); 
chart1.Series[3].Points.Add(new DataPoint(1, 3)); 
chart1.Series[3].Points.Add(new DataPoint(2, 3)); 
//chart1.Series[3].Points.Add(new DataPoint(3, 0)); 

chart1.SaveImage("C:\\Before.png", ChartImageFormat.Png); 

Ảnh của "before.png": enter image description here

Bây giờ loại bỏ những ý kiến ​​cho series không có điểm dữ liệu tại một giá trị x cho:

(Lưu ý tôi thấy nó không làm việc nếu bạn thêm các điểm tại một giá trị x đã cho cho các giá trị mà bạn tạo y = 0 ở cuối - aka ngay trước khi tôi lưu hình ảnh. Thứ tự của các điểm trong chuỗi có vẻ quan trọng đối với StackedColumn, tôi chưa bao giờ làm việc với loại này ngoại trừ điều tra cách trả lời câu hỏi này để có thể là kiến ​​thức chung cho người dùng thuộc loại này)

chart1.Series.Clear(); 
chart1.Series.Add(new Series()); 
chart1.Series.Add(new Series()); 
chart1.Series.Add(new Series()); 
chart1.Series.Add(new Series()); 

foreach (Series s in chart1.Series) 
{ 
    s.ChartType = SeriesChartType.StackedColumn; 
} 

chart1.Series[0].Points.Add(new DataPoint(0, 0)); 
chart1.Series[0].Points.Add(new DataPoint(1, 3)); 
chart1.Series[0].Points.Add(new DataPoint(2, 3)); 
chart1.Series[0].Points.Add(new DataPoint(3, 3)); 

chart1.Series[1].Points.Add(new DataPoint(0, 3)); 
chart1.Series[1].Points.Add(new DataPoint(1, 0)); 
chart1.Series[1].Points.Add(new DataPoint(2, 3)); 
chart1.Series[1].Points.Add(new DataPoint(3, 3)); 

chart1.Series[2].Points.Add(new DataPoint(0, 3)); 
chart1.Series[2].Points.Add(new DataPoint(1, 3)); 
chart1.Series[2].Points.Add(new DataPoint(2, 0)); 
chart1.Series[2].Points.Add(new DataPoint(3, 3)); 

chart1.Series[3].Points.Add(new DataPoint(0, 3)); 
chart1.Series[3].Points.Add(new DataPoint(1, 3)); 
chart1.Series[3].Points.Add(new DataPoint(2, 3)); 
chart1.Series[3].Points.Add(new DataPoint(3, 0)); 

// If you add the empty points here, it does not seem to work. 
// Empty points are as follows, and are already added above in the 'after' example. 
// chart1.Series[0].Points.Add(new DataPoint(0, 0)); 
// chart1.Series[1].Points.Add(new DataPoint(1, 0)); 
// chart1.Series[2].Points.Add(new DataPoint(2, 0)); 
// chart1.Series[3].Points.Add(new DataPoint(3, 0)); 

chart1.SaveImage("C:\\After.png", ChartImageFormat.Png); 

Ảnh của "after.png": (? Mặc dù bạn có thể chèn chúng) enter image description here

Vì vậy, cho rằng bạn không thể thêm số không điểm sau khi thực tế, bạn sẽ cần phải sửa đổi mã của bạn để một cái gì đó như thế này:

var allPossibleGroups = t.StudentReports; 

var groups = t.StudentReports 
      .Where<StudentReport>(rep => rep.IsComplete && rep.FirstSaveTimestamp.HasValue) 
      .GroupBy<StudentReport, DateTime>(rep => rep.FirstSaveTimestamp.Value.Date); 

     bool hasPoints = false; 
     foreach (var g in allPossibleGroups) 
     { 
      if(groups.ContainsKey(g)) 
      { 
       series.Points.AddXY(g.Key, g.Count()); 
       hasPoints = true; 
      } 
      else 
      { 
       series.Points.AddXY(g.Key, 0); 
      } 
     } 

Xin lỗi vì các khối mã dài, nhưng ví dụ này là cần thiết để chứng minh làm thế nào để làm cho nó hoạt động, mà không rơi vào cái bẫy của việc thêm các điểm trống (trong đó y = 0) ở cuối, vì điều đó sẽ không hoạt động.

Hãy cho tôi biết nếu bạn cần thêm trợ giúp.

+0

+1 cảm ơn các mẫu mã tuyệt vời –

5

Ran vào cùng một vấn đề bản thân mình và muốn chia sẻ giải pháp đúng:

Sử dụng DataManipulator để chèn mất tích (x, y) giá trị:

foreach (Series s in chart.Series) 
{ 
    chart.DataManipulator.Sort(PointSortOrder.Ascending, "X", s); 
    chart.DataManipulator.InsertEmptyPoints(1, IntervalType.Number, s); 
} 
+0

Hoạt động Hoàn hảo, cảm ơn. Ngoài ra vẫn không có ý tưởng tại sao điều này xảy ra ... – Lambda

+0

Điều này thực sự cố định chiều rộng cột cho tôi, nhưng khoảng trống vẫn còn đó. –

0

Looping qua loạt không làm việc cho tôi vì một lý do nào đó, nhưng giải pháp tiếp theo hoạt động như một sự quyến rũ:

Chart1.DataManipulator.InsertEmptyPoints(1, IntervalType.Number, "Series1, Series2, Series3, Series4") 
Các vấn đề liên quan