在一张图表中显示两个或多个数据系列(一些数据系列为空值)
displaying two or more data series (some with empty values) in one chart
我有一个系列,每 15 分钟有一个能源消耗的十进制值,一个完整的 year.This 数据来自过去。
现在对未来的能源消耗进行了预测。但是,这里我只有一年中每小时的值。
我想叠加这两个系列以查看区别。由于第二个系列中的缺失值,因此没有一致的线。该行刚刚中断。
这是我添加第一个系列数据的地方。
dtlist.Add(new DataTable(tableIST));
dtlist[0].Columns.Add("Date");
dtlist[0].Columns.Add("Volume1");
dtlist[0].PrimaryKey = new DataColumn[] { dtlist[0].Columns[0] };
DataRow dr;
Series default2 = new Series("Default");
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString))
{
string query = "SELECT TIMESTAMP, LAST FROM " + tableIST;
connection.Open();
int i = 0;
decimal sum = 0;
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
dr = dtlist[0].NewRow();
dr["Date"] = reader.GetDateTime(0);
dr["Volume1"] = reader.GetDecimal(1).ToString().Replace(',', '.');
dtlist[0].Rows.Add(dr);
default2.Points.AddY(reader.GetDecimal(1).ToString().Replace(',', '.'));
}
}
}
}
connection.Close();
}
chart1.DataSource = dttemp = dtlist[0];
这是我添加第二个系列数据并合并它的地方。
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString))
{
string query = "SELECT TIMESTAMP, LAST FROM " + tableName;
connection.Open();
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
dr = dtlist[count].NewRow();
dr["Date"] = reader.GetDateTime(0).Subtract(TimeSpan.FromDays(365));
dr["Volume2"] = reader.GetDecimal(1).ToString().Replace(',', '.');
dtlist[count].Rows.Add(dr);
}
}
}
connection.Close();
}
//merge data in one datatable for displaying
dttemp.Merge(dtlist[1]);
这是我的图表现在的样子。
蓝线是第一个数据系列,黄线是第二个。
它应该看起来像这样。
在第一个系列中,每 4 个值(4、15 分钟值)取平均值(这将为您提供平均小时值),现在您可以绘制图表
这是我实际使用的代码。
DateTime helpDate;
Decimal helpNumber = 0, helpNumber2, difference;
DataTable dthelp = new DataTable();
dthelp.Columns.Add("Date");
dthelp.Columns.Add("Volume" + CountPlusOne);
dthelp.PrimaryKey = new DataColumn[] { dthelp.Columns[0] };
int i = 0;
foreach (DataRow row in dtlist[count].Rows)
{
if (i > 0)
{
helpNumber2 = Decimal.Parse(row["Volume" + CountPlusOne].ToString().Replace('.', ','));
difference = (helpNumber - helpNumber2) / 4;
helpDate = DateTime.Parse(row["Date"].ToString());
dr = dthelp.NewRow();
dr["Date"] = helpDate.Subtract(TimeSpan.FromMinutes(45));
dr["Volume" + CountPlusOne] = (helpNumber - difference).ToString().Replace(',', '.');
dthelp.Rows.Add(dr);
dr = dthelp.NewRow();
dr["Date"] = helpDate.Subtract(TimeSpan.FromMinutes(30));
dr["Volume" + CountPlusOne] = (helpNumber - difference * 2).ToString().Replace(',', '.');
dthelp.Rows.Add(dr);
dr = dthelp.NewRow();
dr["Date"] = helpDate.Subtract(TimeSpan.FromMinutes(15));
dr["Volume" + CountPlusOne] = (helpNumber - difference * 3).ToString().Replace(',', '.');
dthelp.Rows.Add(dr);
}
i++;
helpNumber = Decimal.Parse(row["Volume" + CountPlusOne].ToString().Replace('.', ','));
}
我有一个系列,每 15 分钟有一个能源消耗的十进制值,一个完整的 year.This 数据来自过去。
现在对未来的能源消耗进行了预测。但是,这里我只有一年中每小时的值。
我想叠加这两个系列以查看区别。由于第二个系列中的缺失值,因此没有一致的线。该行刚刚中断。
这是我添加第一个系列数据的地方。
dtlist.Add(new DataTable(tableIST));
dtlist[0].Columns.Add("Date");
dtlist[0].Columns.Add("Volume1");
dtlist[0].PrimaryKey = new DataColumn[] { dtlist[0].Columns[0] };
DataRow dr;
Series default2 = new Series("Default");
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString))
{
string query = "SELECT TIMESTAMP, LAST FROM " + tableIST;
connection.Open();
int i = 0;
decimal sum = 0;
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
dr = dtlist[0].NewRow();
dr["Date"] = reader.GetDateTime(0);
dr["Volume1"] = reader.GetDecimal(1).ToString().Replace(',', '.');
dtlist[0].Rows.Add(dr);
default2.Points.AddY(reader.GetDecimal(1).ToString().Replace(',', '.'));
}
}
}
}
connection.Close();
}
chart1.DataSource = dttemp = dtlist[0];
这是我添加第二个系列数据并合并它的地方。
using (SqlConnection connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["connectionString"].ConnectionString))
{
string query = "SELECT TIMESTAMP, LAST FROM " + tableName;
connection.Open();
using (SqlCommand command = new SqlCommand(query, connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
dr = dtlist[count].NewRow();
dr["Date"] = reader.GetDateTime(0).Subtract(TimeSpan.FromDays(365));
dr["Volume2"] = reader.GetDecimal(1).ToString().Replace(',', '.');
dtlist[count].Rows.Add(dr);
}
}
}
connection.Close();
}
//merge data in one datatable for displaying
dttemp.Merge(dtlist[1]);
这是我的图表现在的样子。
蓝线是第一个数据系列,黄线是第二个。
它应该看起来像这样。
在第一个系列中,每 4 个值(4、15 分钟值)取平均值(这将为您提供平均小时值),现在您可以绘制图表
这是我实际使用的代码。
DateTime helpDate;
Decimal helpNumber = 0, helpNumber2, difference;
DataTable dthelp = new DataTable();
dthelp.Columns.Add("Date");
dthelp.Columns.Add("Volume" + CountPlusOne);
dthelp.PrimaryKey = new DataColumn[] { dthelp.Columns[0] };
int i = 0;
foreach (DataRow row in dtlist[count].Rows)
{
if (i > 0)
{
helpNumber2 = Decimal.Parse(row["Volume" + CountPlusOne].ToString().Replace('.', ','));
difference = (helpNumber - helpNumber2) / 4;
helpDate = DateTime.Parse(row["Date"].ToString());
dr = dthelp.NewRow();
dr["Date"] = helpDate.Subtract(TimeSpan.FromMinutes(45));
dr["Volume" + CountPlusOne] = (helpNumber - difference).ToString().Replace(',', '.');
dthelp.Rows.Add(dr);
dr = dthelp.NewRow();
dr["Date"] = helpDate.Subtract(TimeSpan.FromMinutes(30));
dr["Volume" + CountPlusOne] = (helpNumber - difference * 2).ToString().Replace(',', '.');
dthelp.Rows.Add(dr);
dr = dthelp.NewRow();
dr["Date"] = helpDate.Subtract(TimeSpan.FromMinutes(15));
dr["Volume" + CountPlusOne] = (helpNumber - difference * 3).ToString().Replace(',', '.');
dthelp.Rows.Add(dr);
}
i++;
helpNumber = Decimal.Parse(row["Volume" + CountPlusOne].ToString().Replace('.', ','));
}