2012-01-16 3 views
0

У меня есть следующие данные в таблице базы данных, Столбцы: Дата, час (от 1 до 24) и температура.Создайте линейную диаграмму с отдельными линиями для каждого дня недели?

Я хочу создать линейную диаграмму, которая будет отображаться по оси х в часах от 1 до 24 и по оси Y - Температуры.

Теперь сложная часть состоит в том, что я хочу иметь разные цветовые линии для каждой даты. Так что если дата 2012-01-15, то у меня есть красная линия от 1 до 24, показывающая изменения температуры. если дата 2012-01-14, тогда синяя тоже от 1 до 24.

Чтобы быть ясным, я хочу иметь несколько дат в одной диаграмме.

Вот некоторые из кода у меня есть

 SqlConnection conn2 = new SqlConnection(@"connectionString"); 
     conn2.Open(); 

     SqlCommand cmd2 = new SqlCommand(); 
     cmd2.Connection = conn2; 
     cmd2.CommandText = "SELECT * FROM observation WHERE day BETWEEN @fromDate AND @toDate ORDER BY day ASC, hour ASC "; 
     cmd2.Parameters.AddWithValue("fromDate", dateTimePicker2.Value.Date); 
     cmd2.Parameters.AddWithValue("toDate", dateTimePicker3.Value.Date); 



     SqlDataReader reader = cmd2.ExecuteReader(); 
     DataSet ds = new DataSet(); 
     DataTable dt = new DataTable("dateRange"); 
     dt.Columns.Add("day"); 
     dt.Columns.Add("hour"); 
     dt.Columns.Add("temp"); 

     DataRow dr = dt.NewRow(); 
     int counter = 0; 

     while (reader.Read()) 
     { 
      if (reader[1].ToString() != dt.TableName) 
      { 
       if (dt.Rows.Count != 0 && dt.TableName != "dateRange") 
       { 
        dt.AcceptChanges(); 
        ds.Tables.Add(dt); 
        counter++; 
       } 
       dt = new DataTable(reader[1].ToString()); 
       dt.Columns.Add("day"):      
       dt.Columns.Add("hour"); 
       dt.Columns.Add("temp"); 

      } 
      dr = dt.NewRow(); 
      dr[0] = reader[2]; 
      dr[1] = reader[3]; 
      dt.Rows.Add(dr); 
     } 
     if (dt.Rows.Count != 0) 
     { 
      dt.AcceptChanges(); 
      ds.Tables.Add(dt); 
     } 
     else 
     { 
      lblError.Visible = false; 
     } 

     for (int i = 0; i < counter; i++) 
     { 
      chart1.Series[i].Name = i.ToString(); 
      chart1.Series[i].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; 
      chart1.Series[i].BorderWidth = 5; 
      if (i % 2 == 0) 
      { 
       chart1.Series[i].Color = Color.Red; 
      } 
      else 
      { 
       chart1.Series[i].Color = Color.Green; 
      } 

      chart1.DataSource = ds.Tables[i]; 
      chart1.Series[i].XValueMember = "hour"; 
      chart1.Series[i].YValueMembers = "temp"; 
     } 

     chart1.Legends[0].Alignment = StringAlignment.Center; 
     chart1.Legends[0].Docking = System.Windows.Forms.DataVisualization.Charting.Docking.Top; 

     chart1.DataBind(); 
     chart1.Visible = true; 

     cmd2.Connection.Close(); 

Спасибо!

+0

Что часть у вас возникли проблемы с? Извлечение данных из базы данных; создание диаграммы; разработка различных цветов для разных дат; показаны несколько строк в одном графике? Если бы вы могли опубликовать код, с которого вы начали, вы могли бы ожидать коротких и сжатых ответов. Или вы ищете приблизительные рекомендации? – Jonno

+0

@Jonno На данный момент у меня возникают проблемы с отображением нескольких строк при сохранении 1 по 24 по оси x. Я попытался создать несколько таблиц внутри одного DataSet, но это не способ указать, какую таблицу использовать .... Я не уверен, как создать несколько строк, это будет несколько рядов? – NicoTek

+0

@Jonno. Я добавил код, который у меня есть. Я знаю, что это беспорядочно: S Любая помощь будет принята с благодарностью – NicoTek

ответ

1

Решение, которое я нашел, состояло в том, чтобы изменить формат моего источника данных. Я создал DataTable, первый столбец - часы, и он идет от 1 до 24. следующие столбцы - это один для каждого дня, который я хочу представлять.

Есть два запроса. первый из них - знать, сколько дней находится в интервале и создать соответствующее количество столбцов и рядов. Второй запрос - это тот, который содержит все данные.

Вот код:

 SqlConnection conn = new SqlConnection(connectionString); 

     SqlCommand cmd = new SqlCommand(); 
     cmd.Connection = conn; 
     cmd.CommandText = "SELECT day FROM observation WHERE day BETWEEN @from AND @to GROUP BY day"; 
     cmd.Parameters.AddWithValue("from", Convert.ToDateTime(dateFrom)); 
     cmd.Parameters.AddWithValue("to", Convert.ToDateTime(dateTo)); 
     cmd.Connection.Open(); 

     SqlDataReader rdr = cmd.ExecuteReader(); 

     DataTable dt = new DataTable("DATA"); 
     dt.Columns.Add("Hour"); 

     int days = 0; 
     chart1.DataSource = dt; 
     while (rdr.Read()) 
     { 
      dt.Columns.Add(((DateTime)rdr[0]).ToString("yyyy-MM-dd")); 

      if (days == 0) 
      { 
       chart1.Series[days].Name = ((DateTime)rdr[0]).ToString("yyyy-MM-dd"); 
      } 
      else 
      { 
       chart1.Series.Add(((DateTime)rdr[0]).ToString("yyyy-MM-dd")); 
      } 
      chart1.Series[((DateTime)rdr[0]).ToString("yyyy-MM-dd")].XValueMember = "Hour"; 
      chart1.Series[((DateTime)rdr[0]).ToString("yyyy-MM-dd")].YValueMembers = ((DateTime)rdr[0]).ToString("yyyy-MM-dd"); 
      chart1.Series[((DateTime)rdr[0]).ToString("yyyy-MM-dd")].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; 
      days++; 
     } 
     rdr.Close(); 

     DataRow dr = dt.NewRow(); 
     for (int i = 1; i < 25; i++) 
     { 
      dr = dt.NewRow(); 
      dr["Hour"] = i; 
      dt.Rows.Add(dr); 
     } 

     cmd.CommandText = "SELECT * FROM observation WHERE day BETWEEN @from2 AND @to2 ORDER BY day ASC, hour ASC "; 
     cmd.Parameters.AddWithValue("from2", Convert.ToDateTime(fromDate)); 
     cmd.Parameters.AddWithValue("to2", Convert.ToDateTime(toDate)); 

     rdr = cmd.ExecuteReader(); 
     while (rdr.Read()) 
     { 
      dt.Rows[((int)(rdr[2]) - 1)][(((DateTime)rdr[1]).ToString("yyyy-MM-dd"))] = rdr[3]; 
     } 

     cmd.Connection.Close(); 
     rdr.Close(); 

     dataGridView1.DataSource = dt; 

     chart1.DataBind(); 
     chart1.Visible = true; 
1

для того, чтобы создать несколько строк, вы должны создать Mulitple серии, но я не уверен, какой тип диаграммы вы используете здесь очень хороший учебник о картах

http://www.4guysfromrolla.com/articles/072209-1.aspx

Chart1.Series[0].Points.FindMinByValue().Color = Color.Red; , что должно измените цвет, который вы хотите для каждой точки.

+0

Если я создаю много серий, как я должен структурировать DataSource для подачи многих серий? – NicoTek

+0

Я не думаю, что вам нужно использовать много серий, если вы используете пример выше и на основе того, что вы хотите сделать, я бы не привязывал источник, я бы управлял каждым числом с каждым циклом таким образом, я могу управлять внешним видом и создать много серий. –

+0

Я создал решение, основанное на некоторых ваших данных. вы можете увидеть это ниже. Благодаря! – NicoTek

0
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

dtTest.Columns.Add("TimePoint", GetType(Integer)) 
dtTest.Columns.Add("Speed", GetType(Integer)) 

dtTest.Rows.Add(0, 0) 
dtTest.Rows.Add(1000, 50) 
dtTest.Rows.Add(2000, 50) 
dtTest.Rows.Add(3000, 0) 

With Chart1.ChartAreas(0) 
    .AxisX.Minimum = 0 
    .AxisX.Maximum = 3000 
    .AxisY.Minimum = 0 
    .AxisY.Maximum = 60 
    .AxisY.Interval = 10 
    .AxisX.Title = "Elapsed Time (ms)" 
    .AxisY.Title = "Speed (km/hr)" 
End With 
End Sub 

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
    With Chart1.Series(0) 
     .Points.DataBind(dtTest.DefaultView, "TimePoint", "Speed", Nothing) 
     .ChartType = DataVisualization.Charting.SeriesChartType.Line 
     .BorderWidth = 4 
    End With 
End Sub 
+0

Спасибо за сообщение! Хотя фрагмент кода может ответить на вопрос, по-прежнему замечательно добавлять дополнительную информацию, например, объяснять и т. Д. – j0k

Смежные вопросы