C#でグラフを書く方法

# グラフを書きたいが
`Chart`が追加できない！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/2cf650c6-65e4-2f45-392a-5f421147189a.png)
右クリック「すべて表示」にすると存在することはわかるんだが、追加できない！

原因：LiveChartはNET6.0ではおそらく使えません。Windowsフォーム用ではないからかもしれませんが・・・

# OxyPlotを使おう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/df7e45b1-7b42-502b-c689-67cc984be0ad.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/4ad79e3c-787f-0e06-c585-50d1fe3237c0.png)

https://www.youfit.co.jp/archives/4137

https://www.youfit.co.jp/archives/4505

https://resanaplaza.com/2020/12/31/%E3%80%90wpf%E3%80%91%E3%81%84%E3%81%A1%E3%81%B0%E3%82%93%E3%82%84%E3%81%95%E3%81%97%E3%81%84-oxy-plot-%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%EF%BC%88windowsform%E5%85%B1%E9%80%9A%EF%BC%89/

# プロットする

```C#:using
using OxyPlot.Axes;
using OxyPlot.Series;
using OxyPlot;
```

```C#:初期設定
//内部メンバ
private LineSeries line;
private LinearAxis X;
private LinearAxis Y;

//コンストラクタ処理
this.graph.Model = new PlotModel();
X = new LinearAxis()
{
    IsAxisVisible = false,
    AxislineColor = OxyColors.White
};
Y = new LinearAxis();
X.Position = AxisPosition.Bottom;
Y.Position = AxisPosition.Left;
graph.Model.Axes.Add(X);
graph.Model.Axes.Add(Y);

line = new LineSeries()
{
    Color = OxyColors.Blue,
    LineStyle = LineStyle.Solid,
    StrokeThickness = 1

};
graph.Model.Series.Add(line);

graph.Model.Background = OxyColors.White;
graph.InvalidatePlot(true);
```

```C#:データ追加
line.Points.Add(new DataPoint(x,y));
```
点を追加することで折れ線グラフの点が増えていく

# 背景色を変更

```C#
this.graph.Model.Background = OxyColor.FromRgb(color.R, color.G, color.B);
```

# 背景色を透明にする

```C#
//コンストラクタ内
this.TransparencyKey = Color.Blue;

//背景色設定関数
public void set_back_color(Color color)
{
    this.graph.Model.Background = OxyColor.FromRgb(color.R, color.G, color.B);
}

//透明化する
set_back_color(Color.Blue);
```

透明色は存在する？

`BackColor`を`OxyPlot.Colors.Transparent`にしても透過しない・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/3a144ff6-d0af-cf23-7f94-0cee567f3815.png)



# 曲線の色を変更

```C#
this.line.Color = OxyColor.FromRgb(color.R, color.G, color.B);
```

# 軸の色変更
今のところできない・・・

# 要素を追加する

```C#
line.Points.Add(new DataPoint(x, y));
```

# 要素をクリアする

```C#
line.Points.Clear();
```

# 曲線を太くする

```C#
public void set_thickness(double thickness)
{
    this.line.StrokeThickness = thickness;
}
```
douleで指定する

# 背景に画像を指定する

ここで、`BackColor`を`OxyPlot.Colors.Transparent`にする効果が現れるぜ

```C#
public void set_back_img(Image img)
{
    this.graph.Model.Background = OxyColors.Transparent;
    this.graph.BackgroundImage= img;
}
```

```C#:ダイアログで選択する方式(参考)
private void back_img_Click(object sender, EventArgs e)
{
    string ret = string.Empty;
    using (OpenFileDialog openFileDialog = new OpenFileDialog())
    {
        openFileDialog.Title = "フォーム背景画像選択ダイアログ";
        openFileDialog.Filter = "Image File(*.bmp,*.jpg,*.png,*.tif)|*.bmp;*.jpg;*.png;*.tif|Bitmap(*.bmp)|*.bmp|Jpeg(*.jpg)|*.jpg|PNG(*.png)|*.png";
        openFileDialog.InitialDirectory = @"C:\";

        //ファイル選択ダイアログを開く
        if (openFileDialog.ShowDialog() == DialogResult.OK)
        {
            ret = openFileDialog.FileName;
            System.Drawing.Image img = System.Drawing.Image.FromFile(ret);

            graph_display.set_back_img(img);
            back_img_pass = ret;
        }
    }
}
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/0a6a58d0-ce8a-1438-eff0-af46fd24dfbf.png)

画像サイズは考慮されないため、リサイズが必要だね。
ChatGPTで解決！（著作権的に載せられません）


(以下、OxyPlot以外の内容)
---

# フォームの背景を透明にする
フォーム全体にpictureBoxをつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/c7f74da9-c743-d81b-50d0-1577864ff601.png)

pictureBoxの色を透明色キー色にすることで透明にする

```C#
this.TransparencyKey = Color.Green;
this.pictureBox1.BackColor = Color.Green;
```

なぜか、青とかだとできない。理由不明

```C#
this.TransparencyKey = Color.Blue; // 透明な色を透過色として設定
this.pictureBox1.BackColor = Color.Blue;
```


# フォーム内にフォームをいれる方式の場合で、背景を透明にする
内部フォームの透明化：前述の方法で可能
親フォーム側の透明化：前述の方法で可能
内部フォームのみ透明化：不可（親側も透けてしまう）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/405484/d83b93ba-285e-00b0-d019-053df5c9336b.png)

# 配列の要素の追加
Appendは本体に追加されない！Addを使うと良い

```C#
//宣言
private List<float> array;
//生成
array = new List<float>();
//追加
array.Add(data);
```


（追記）
ChatGPT有能すぎる！
ネットにない情報（おそらく海外）を持ってきてくれるから、めっちゃらくだ！
というか、関数そのまま使えたりするのやばい。工数がめっちゃ減る