Fuwafuwa's memorandum

Fuwafuwa's memorandum

Data analysis, development, reading, daily feeling.
MENU

ASP.NET: AJAXでSQL serverのデータを可視化する

ASP.NETのチャートはとってもよいのですが
もっとかわいいチャートを描きたいと思い、AJAXを導入しました。

チャートを描くからにはSQLからデータを引っ張りたいですね。
下記のサイトを参考にしました。
ASP.Net AJAX Bar Chart Control: Populate from Database example

上記では判例やバーの色、バーの重ね合わせなどに言及がなかったので
もう少し改良しました。

この記事では、最終的に下記のようなグラフを作成します。 AJAXでSQLserverのデータを可視化する
作成の手順です。

SQL serverにテストデータを作成。
グループ名を格納するデータ。

CREATE TABLE [ns_group_name]
	( [group] NVARCHAR(100) )

INSERT INTO [ns_group_name]
VALUES('iris'),
('anemone'),
('peony');
グループごとのメンバー数を格納するデータ。
CREATE TABLE [ns_menber_table]
	( [group] NVARCHAR(100)
	, [year] DATE
	, [male_number] INT
	, [female_number] INT ) 

INSERT INTO [ns_menber_table]
VALUES 
('iris','2010','34','29'),
('iris','2011','30','32'),
('iris','2012','33','35'),
('iris','2013','41','37'),
('iris','2014','34','36'),
('iris','2015','38','35')
データの準備が整ったのでASP.NETで早速作図していきます。

Web.configに下記を追加する。

  

aspxファイルに下記のディレクティブを追加し、コントロールを登録
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajax" %>
ツールボックスのToolScriptManegerをaspxファイルにドラッグ&ドロップ
下記のコードが反映されます。


ツールボックスのDropDownListをaspxファイルにドラッグ&ドロップ
下記のコードが反映されます。


ツールボックスのAJAX Control ToolkitにあるBarChartをaspxファイルにドロップ&ドロップし、サイズらラベル、色を調整


csファイルに下記を追加する
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespaceを書き換える。
public partial class test_page : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string query = "SELECT group FROM [group_name]"";
            DataTable dt = GetData(query);
            group.DataSource = dt;
            group.DataTextField = "group";
            group.DataValueField = "group";
            group.DataBind();
            group.Items.Insert(0, new ListItem("Select", ""));
        }
    }

    protected void group_SelectedIndexChanged(object sender, EventArgs e)
    {
        string query = string.Format("SELECT SUBSTRING(CONVERT(NVARCHAR,[year],121),1,4),[male_number],[female_number] FROM [ns_menber_table] WHERE [group] = '{0}'", group.SelectedItem.Value);
        DataTable dt = GetData(query);

        string[] x = new string[dt.Rows.Count];
        decimal[] y = new decimal[dt.Rows.Count];
        decimal[] z = new decimal[dt.Rows.Count];

        for (int i = 0; i < dt.Rows.Count; i++)
        {
            x[i] = dt.Rows[i][0].ToString();
            y[i] = Convert.ToInt32(dt.Rows[i][1]);
            z[i] = Convert.ToInt32(dt.Rows[i][2]);
        }

        BarChart1.Series.Add(new AjaxControlToolkit.BarChartSeries { Data = y, BarColor = "#8abcd9", Name = "male"}); //バーのデータ、色、凡例名を設定します
        BarChart1.CategoriesAxis = string.Join(",", x);
        BarChart1.ChartTitle = string.Format("{0} Order Distribution", group.SelectedItem.Value);

        BarChart1.Series.Add(new AjaxControlToolkit.BarChartSeries { Data = z, BarColor = "#d98aae", Name = "female" });
        BarChart1.CategoriesAxis = string.Join(",", x);
        BarChart1.ChartTitle = string.Format("{0} Order Distribution", group.SelectedItem.Value); 
        
        if (x.Length > 3)
        {
            BarChart1.ChartWidth = (x.Length * 100).ToString();
        }
        BarChart1.Visible = group.SelectedItem.Value != "";
    }

    private static DataTable GetData(string query)
    {
        DataTable dt = new DataTable();
        string constr = ConfigurationManager.ConnectionStrings["DB"].ConnectionString;
        using (SqlConnection con = new SqlConnection(constr))
        {
            using (SqlCommand cmd = new SqlCommand(query))
            {
                using (SqlDataAdapter sda = new SqlDataAdapter())
                {
                    cmd.CommandType = CommandType.Text;
                    cmd.Connection = con;
                    sda.SelectCommand = cmd;
                    sda.Fill(dt);
                }
            }
            return dt;
        }
    }
}
完了です。

ASP.NET: Chartを表示する

[C#] Chart コントロールを利用して ASP.NET Webアプリでグラフを表示する

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.DataVisualization.Charting; //グラフィックを調整
using System.Drawing; //グラフィックを調整

namespace SimpleChart
{
  public partial class Default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      Chart1.Series.Add("series1");
      Chart2.Series["series"].ChartType = SeriesChartType.Line; //チャートの種類を指定
      Chart1.Series["series1"].XValueType = System.Web.UI.DataVisualization.Charting.ChartValueType.Int32; //x軸の型を指定

      Chart1.Series["series1"].Points.AddXY(1, 55);
      Chart1.Series["series1"].Points.AddXY(2, 72);
      Chart1.Series["series1"].Points.AddXY(3, 80);
      Chart1.Series["series1"].Points.AddXY(4, 49);
      Chart1.Series["series1"].Points.AddXY(5, 76);
    }
  }
}

Python: matplotlibでヒストグラムを描画する

Matplotlibでヒストグラムを描画する方法

import numpy as np
import matplotlib.pyplot as plt

x = 45 + 10 * np.random.randn(1000)
y = 50 + 20 * np.random.randn(1000)
z = 55 + 15 * np.random.randn(1000)

##半透明にして図を重ねる
fig = plt.figure(figsize=(12,10)) 
ax = fig.add_subplot(1,1,1)

ax.hist(x, bins=50, normed=True,color='red',alpha=0.5)
ax.hist(y, bins=50, normed=True,color='blue',alpha=0.5)
ax.hist(z, bins=50, normed=True,color='orange',alpha=0.5)

ax.set_title('first histogram $\mu=100,\ \sigma=15$')
ax.set_xlabel('x')
ax.set_ylabel('freq')
fig.show()

##横に並べる
fig = plt.figure(figsize=(12,10)) 
ax = fig.add_subplot(1,1,1)

ax.hist([x, y, z], bins=10, normed=True, color=['red', 'blue', 'orange'], label=['x', 'y', 'z'])

ax.set_title('seventh histogram $\mu1=100,\ \sigma1=15,\ \mu2=50,\ \sigma2=4$')
ax.set_xlabel('x')
ax.set_ylabel('freq')
ax.legend(loc='upper left')
fig.show()

ASP.NET: チャートを表示

ツールボックスからデザインにChartをドラッグ&ドロップ。
右上の「>」ボタンをクリック。
Chartタスクからデータソースを選択。
グラフの種類、x値メンバー、y値メンバーを選択。

ソースからもクエリ等書き換え可。

Python: ヒストグラムをプロット

下記から引用
pandas 0.20.1 documentation

from numpy.random import *
import pandas as pd
import matplotlib.pyplot as plt

##データの作成 
df4 = pd.DataFrame({'a': randn(1000) + 1, 'b': randn(1000),
                 'c': randn(1000) - 1}, columns=['a', 'b', 'c'])

##プロット
plt.figure()
df4.plot(kind='hist',alpha=0.5)
20170509ヒストグラム

該当の記事は見つかりませんでした。