作成日: 2021/12/27 最終更新日: 2022/04/27
文書種別
不具合
発生環境
2021J v3(4.5.20213.532)
状況
修正済み
詳細
傾向線(近似直線)を表すTrendLineのStyle.LinePatternを設定しても有効になりません。
例えばLinePatternをDashDotDotに設定しても、傾向線が直線で描画されます。
※2021J v2(4.5.20212.513)ではこの現象は発生しません。
例えばLinePatternをDashDotDotに設定しても、傾向線が直線で描画されます。
※2021J v2(4.5.20212.513)ではこの現象は発生しません。
回避方法
この問題は2022J v1(4.5.20221.548)で修正されました。
※修正版を適用しない場合の回避方法は以下の通りです。
※修正版を適用しない場合の回避方法は以下の通りです。
本来の傾向線を非表示にして、Renderedイベント内で独自に直線を描画します。
※FitType = C1.Chart.FitType.Linearの場合に限定
◎サンプルコード(VB)
※FitType = C1.Chart.FitType.Linearの場合に限定
◎サンプルコード(VB)
Imports C1.Win.Chart
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
'サンプルデータ
Dim dataTable As System.Data.DataTable = New System.Data.DataTable
dataTable.Columns.Add("POINT_X", GetType(System.Double))
dataTable.Columns.Add("POINT_Y", GetType(System.Double))
dataTable.Rows.Add(dataTable.NewRow)
dataTable.Rows.Add(dataTable.NewRow)
dataTable.Rows(0)("POINT_X") = 0
dataTable.Rows(0)("POINT_Y") = 0
dataTable.Rows(1)("POINT_X") = 1
dataTable.Rows(1)("POINT_Y") = 1
'散布図
FlexChart1.ChartType = C1.Chart.ChartType.Scatter
FlexChart1.AxisX.Min = 0
FlexChart1.AxisX.Max = 1.2
FlexChart1.AxisY.Min = 0
FlexChart1.AxisY.Max = 1.2
'系列追加
FlexChart1.Series.Clear()
Dim series As Series = New Series
FlexChart1.Series.Add(series)
series.DataSource = dataTable
series.BindingX = "POINT_X"
series.Binding = "POINT_Y"
'近似直線追加
Dim trendLine As TrendLine = New TrendLine()
trendLine.Name = "Trendline"
trendLine.DataSource = dataTable
trendLine.BindingX = "POINT_X"
trendLine.Binding = "POINT_Y"
trendLine.FitType = C1.Chart.FitType.Linear
FlexChart1.Series.Add(trendLine)
trendLine.Style.StrokeWidth = 3
trendLine.Style.StrokeColor = Color.Black
'LinePatternの設定が有効にならない
trendLine.Style.LinePattern = C1.Chart.LinePatternEnum.DashDotDot
'【対応策】:近似直線の非表示
trendLine.Visibility = C1.Chart.SeriesVisibility.Hidden
End Sub
Private Sub FlexChart1_Rendered(sender As Object, e As C1.Win.Chart.RenderEventArgs) Handles FlexChart1.Rendered
'//【対応策】:近似直線の描画
Dim trendLine As TrendLine = CType(FlexChart1.Series(1), C1.Win.Chart.TrendLine)
If (trendLine.Coefficients.Length = 2) Then
Dim p As Pen = New Pen(Color.Black)
p.DashStyle = Drawing2D.DashStyle.DashDotDot
p.Width = 3
Dim x1 = CType(FlexChart1.AxisX.Convert(trendLine.GetValues(1)(0)), Integer)
Dim x2 = CType(FlexChart1.AxisX.Convert(trendLine.GetValues(1)((trendLine.GetValues(1).Length - 1))), Integer)
Dim y1 = CType(FlexChart1.AxisY.Convert(trendLine.GetValues(0)(0)), Integer)
Dim y2 = CType(FlexChart1.AxisY.Convert(trendLine.GetValues(0)((trendLine.GetValues(0).Length - 1))), Integer)
e.Graphics.DrawLine(p, New Point(x1, y1), New Point(x2, y2))
End If
End Sub
End Class
◎サンプルコード(C#)
using C1.Win.Chart;
namespace test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
//サンプルデータ
System.Data.DataTable dataTable = new System.Data.DataTable();
dataTable.Columns.Add("POINT_X", typeof(double));
dataTable.Columns.Add("POINT_Y", typeof(double));
dataTable.Rows.Add(dataTable.NewRow());
dataTable.Rows.Add(dataTable.NewRow());
dataTable.Rows[0]["POINT_X"] = 0;
dataTable.Rows[0]["POINT_Y"] = 0;
dataTable.Rows[1]["POINT_X"] = 1;
dataTable.Rows[1]["POINT_Y"] = 1;
//散布図
flexChart.ChartType = C1.Chart.ChartType.Scatter;
flexChart.AxisX.Min = 0;
flexChart.AxisX.Max = 1.2;
flexChart.AxisY.Min = 0;
flexChart.AxisY.Max = 1.2;
//系列追加
flexChart.Series.Clear();
Series series = new Series();
flexChart.Series.Add(series);
series.DataSource = dataTable;
series.BindingX = "POINT_X";
series.Binding = "POINT_Y";
//近似直線追加
var trendLine = new TrendLine()
{
Name = "Trendline",
DataSource = dataTable,
BindingX = "POINT_X",
Binding = "POINT_Y",
FitType = C1.Chart.FitType.Linear,
};
flexChart.Series.Add(trendLine);
trendLine.Style.StrokeWidth = 3;
trendLine.Style.StrokeColor = Color.Black;
//LinePatternの設定が有効にならない
trendLine.Style.LinePattern = C1.Chart.LinePatternEnum.DashDotDot;
//【対応策】:近似直線の非表示
trendLine.Visibility = C1.Chart.SeriesVisibility.Hidden;
}
private void flexChart_Rendered(object sender, C1.Win.Chart.RenderEventArgs e)
{
//【対応策】:近似直線の描画
var trendLine = flexChart.Series[1] as TrendLine;
if (trendLine.Coefficients.Length == 2)
{
using (Pen p = new Pen(Color.Black) { DashStyle = System.Drawing.Drawing2D.DashStyle.DashDotDot, Width = 3 })
{
var x1 = (int)flexChart.AxisX.Convert(trendLine.GetValues(1)[0]);
var x2 = (int)flexChart.AxisX.Convert(trendLine.GetValues(1)[trendLine.GetValues(1).Length - 1]);
var y1 = (int)flexChart.AxisY.Convert(trendLine.GetValues(0)[0]);
var y2 = (int)flexChart.AxisY.Convert(trendLine.GetValues(0)[trendLine.GetValues(0).Length - 1]);
e.Graphics.DrawLine(p, new Point(x1, y1), new Point(x2, y2));
}
}
}
}
}