質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.78%

Chartで折れ線と100%積上げグラフを作成しているのですが積上げグラフが上手く表示出来ません

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 7,061

score 31

イメージ説明### 前提・実現したいこと
VB2010 Windows7環境
Chartで折れ線と100%積上げグラフを表示したい。

 発生している問題

積上げグラフが棒グラフにしかならない

 該当のソースコード

CharTはForMに張り付けている

#Region "GRAPH 初期化"

    Private Sub ChartClar(ByVal cht As Chart)
        'Chart の設定を初期値に戻す(通常は必要ありません)
        With cht
            .Titles.Clear()                  'タイトルの初期化
            .BackGradientStyle = GradientStyle.None
            .BackColor = Color.White         '背景色を白色に
            '外形をデフォルトに
            .BorderSkin.SkinStyle = BorderSkinStyle.None
            .Legends.Clear()                 '凡例の初期化
            .Legends.Add("Legend1")
            .Series.Clear()                  '系列(データ関係)の初期化
            .ChartAreas.Clear()              '軸メモリ・3D 表示関係の初期化
            .ChartAreas.Add("ChartArea1")
            .Annotations.Clear()
        End With
    End Sub

#End Region

#Region "GRAPH 印刷 (営業所別)"

    Private Sub Chart_Display_EIGYO()

        Chart1.DataSource = ds                       'Chart に表示するデータソースを設定
        colums = ds.Tables(0).Columns.Count - 1      'データの系列数を取得

        Call ChartClar(Chart1)  '設定を一旦初期値に戻す。(通常は必要ありません。)

        With Chart1
            'For i As Integer = 1 To colums
            For i As Integer = 1 To 7
                Dim columnName As String = ds.Tables(0).Columns(i).ColumnName.ToString()
                .Series.Add(columnName)
                .Series(columnName).ChartType = DataVisualization.Charting.SeriesChartType.Column
                .Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString()
                .Series(columnName).YValueMembers = columnName
            Next

ここに言語を入力 StackedColumn100
を追加

For i As Integer = 7 To 11

Dim columnName As String = ds.Tables(0).Columns(i).ColumnName.ToString()
.Series.Add(columnName)
.Series(columnName).ChartType = DataVisualization.Charting.SeriesChartType.StackedColumn100
.Series(columnName).XValueMember = ds.Tables(0).Columns(0).ColumnName.ToString()
.Series(columnName).YValueMembers = columnName
Next

![イメージ説明](fcd9ac8724b0d235c82aed09d352b484.png)            '------------- ここまでは、基本的な表示設定と同じ -----------------------------------------
            With Chart1
                .Series(0).YAxisType = AxisType.Primary
                'Series(0) のグラフを折れ線に設定
                .Series(0).ChartType = SeriesChartType.Line
                .Series(0).Color = Color.Black
                .Series(0).BorderWidth = 2
                .Series(0).MarkerStyle = MarkerStyle.Star5
                .Series(0).MarkerSize = 8
                .Series(0).MarkerColor = Color.Black
                '■文字制限の為Series(1)~Series(5)を割愛

            End With

            '■-----------------------------------------------------------------End----■


            '■------------------------ Y軸 に関する設定 -------------------------Start--■

            With Chart1.ChartAreas(0).AxisY
                .LabelStyle.Format = "#,##0"  '桁区切りで表示の場合
                .LabelAutoFitMaxFontSize = 11
            End With
            '■-------------------------------------------------------------------End----■

            '■------------------------- 第二Y軸関係の設定 ---------------------Start--■
            With Chart1
                '■
                'Series(5) をY軸で表示
                .Series(6).YAxisType = AxisType.Secondary
                .Series(6)("DrawingStyle") = "Cylinder"
                .Series(6).Color = Color.Red
                .Series(6)("PointWidth") = "0.5"
                '第二Y軸の目盛り関係の設定
                With .ChartAreas(0).AxisY2
                    '.Maximum = 8000      '点数の最大値
                    '.Minimum = 0         '点数の最小値
                    '.Interval = 1000     '点数のメモリ間隔
                    .LineDashStyle = DataVisualization.Charting.ChartDashStyle.Solid
                    '.LabelAutoFitMaxFontSize = 10
                    '.LabelAutoFitMinFontSize = 8
                    .LabelStyle.ForeColor = Color.Red
                    .LineColor = Color.Red ' Color.LightGreen
                    .LineWidth = 2
                    .LabelStyle.Format = "#,###"  '桁区切りで表示の場合
                    .MajorGrid.LineColor = Color.Red
                    .MajorGrid.LineDashStyle = DataVisualization.Charting.ChartDashStyle.Dash
                End With
            End With
            '■-----------------------------------------------------------------End----■
            GoTo AA
            Dim series() As Series = New Series(6) {}
            series(0) = Chart1.Series(0)
            series(1) = Chart1.Series(1)
            series(2) = Chart1.Series(2)
            series(3) = Chart1.Series(3)
            series(4) = Chart1.Series(4)
            series(5) = Chart1.Series(5)

            Chart1.Series.Clear()

            Chart1.Series.Add(series(5))
            Chart1.Series.Add(series(0))
            Chart1.Series.Add(series(1))
            Chart1.Series.Add(series(2))
            Chart1.Series.Add(series(3))
            Chart1.Series.Add(series(4))
AA:
            '■------------------------ X軸 に関する設定 -------------------------Start--■
            With Chart1.ChartAreas(0).AxisX

                .IsLabelAutoFit = True  '下記設定は、(True 既定値)に設定しておかないと有効とならない。
                .LabelAutoFitStyle = LabelAutoFitStyles.DecreaseFont Or LabelAutoFitStyles.IncreaseFont
                .LabelAutoFitMaxFontSize = 15
                .LabelAutoFitMinFontSize = 5     '5 以下の設定はできない

                .MajorGrid.Interval = 0    ' 1 に変更して試して見てください。 
                .MajorGrid.IntervalOffset = 0.5  '列と列の間に表示される

                .LabelStyle.Interval = 1    '1データ毎に表示(すべて表示)

                .LineColor = Color.Red
                .LineWidth = 2

            End With
            '■-------------------------------------------------------------------End----■
            '■------------------- データポイントラベルの設定・表示 ----------------Start--■
            For i As Integer = 0 To .Series.Count - 1
                With .Series(i)
                    'データラベルにデータポイントの Y 値を表示
                    .Label = "#VALY{#,##0}"  'マクロ(キーワード)で指定 注① 参照
                    If i = 0 Then .LabelForeColor = Color.DarkViolet '**
                    If i = 1 Then .LabelForeColor = Color.Black '**
                    If i = 2 Then .LabelForeColor = Color.Green '**
                    If i = 3 Then .LabelForeColor = Color.Brown '**
                    If i = 4 Then .LabelForeColor = Color.Blue '**
                    If i = 5 Then .LabelForeColor = Color.Red '** 
                    .Font = New Font("", 11)
                    '.Font = New Font("MS P明朝", 10, FontStyle.Bold)
                End With
            Next
            '■---------------------------------------------------------------------End----■


            '☆★☆★☆★☆★☆★☆★☆★☆★ ここからは、グラフの装飾の部分です ☆★☆★☆★☆★☆★☆★☆★☆★

            '■------------------- 凡例の設定 ----------------Start--■
            'If btnTAN.Checked = True Then
            '.Series(0).LegendText = "当月粗利"             '独自の凡例を設定する
            'Else

            .Series(0).LegendText = "合計"               '独自の凡例を設定する
            .Series(1).LegendText = "本 社"             '独自の凡例を設定する
            .Series(2).LegendText = "北海道"             '独自の凡例を設定する
            .Series(3).LegendText = "東 北"             '独自の凡例を設定する
            .Series(4).LegendText = "関 東"             '独自の凡例を設定する
            .Series(5).LegendText = "九 州"             '独自の凡例を設定する

            .Legends(0).Alignment = StringAlignment.Center     '凡例の縦方向の表示位置
            .Legends(0).BorderColor = Color.Red                '凡例の枠の線の色
            .Legends(0).BackColor = Color.Yellow               '凡例のバックカラー
            .Legends(0).Docking = Docking.Bottom               '凡例の横方向の表示位置
            .Legends(0).ShadowOffset = 4                       '枠に影を付けて立体的に表示
            '■-------------------------------------------------End----■
            '■------------------- 棒のカラーを指定の色に設定 ----------------Start--■
            '■------------------- タイトルを設定 ----------------Start--■
            Chart1.Titles.Add("")
            With Chart1.Titles(0)
                .Alignment = Drawing.ContentAlignment.TopCenter
                .ForeColor = Color.Red
                .Font = New Font("", 12)
                .Text = Page_Title
            End With

            Chart1.Titles.Add("")
            With Chart1.Titles(1)
                .Alignment = Drawing.ContentAlignment.MiddleLeft
                '.Font = New Font("MS P明朝", 10)
                .Font = New Font("", 12)
            End With
            '■----------------------------------------------------End----■

        End With

    End Sub

#End Region
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • SurferOnWww

    2018/09/25 09:56

    タグを VB.NET に修正してください。Windows Forms アプリの Chart コントロールの話ですよね?

    キャンセル

回答 1

+2

アップされたコードはほとんど読んでないのでハズレかもしれませんが・・・

積上げグラフが上手く表示出来ません

Series.ChartType プロパティを SeriesChartType.StackedColumn に設定する必要があるはずです。

【追伸】

以前作ったサンプルをアップしておきます。

このようなグラフなら、

イメージ説明

以下のコードでできます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Windows.Forms.DataVisualization.Charting;

namespace WindowsFormsChart
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private DataTable CreateDataTable()
        {
            string connString = @"Data Source=(local)\sqlexpress;Initial Catalog=Database;Integrated Security=True";
            string selectQuery = 
                @"SELECT 
                    Month, 
                    SUM(CASE WHEN Name = N'三吉' THEN Sales ELSE 0 END) AS 三吉, 
                    SUM(CASE WHEN Name = N'春日' THEN Sales ELSE 0 END) AS 春日, 
                    SUM(CASE WHEN Name = N'東雲' THEN Sales ELSE 0 END) AS 東雲, 
                    SUM(CASE WHEN Name = N'府中' THEN Sales ELSE 0 END) AS 府中, 
                    SUM(CASE WHEN Name = N'広島' THEN Sales ELSE 0 END) AS 広島 
                    FROM Shop GROUP BY Month";
            using (SqlConnection connection = new SqlConnection(connString))
            {
                SqlDataAdapter adapter = new SqlDataAdapter();
                adapter.SelectCommand = new SqlCommand(selectQuery, connection);
                DataTable table = new DataTable();
                adapter.Fill(table);
                return table;
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Chart chart = new Chart()
            {
                Name = "chart1",
                Width = 600,
                DataSource = CreateDataTable()                
            };

            this.Controls.Add(chart);

            Legend legend = new Legend()
            {
                DockedToChartArea = "ChartArea1",
                IsDockedInsideChartArea = false,
                Name = "Legend1"
            };
            chart.Legends.Add(legend);

            Series series = new Series()
            {
                Name = "三吉",
                ChartType = SeriesChartType.StackedColumn,
                CustomProperties = "DrawingStyle=Cylinder",
                IsValueShownAsLabel = true,
                Label = "#PERCENT{P1}",
                Legend = "Legend1",
                XValueMember = "Month",
                YValueMembers = "三吉"
            };
            chart.Series.Add(series);

            series = new Series()
            {
                Name = "春日",
                ChartType = SeriesChartType.StackedColumn,
                CustomProperties = "DrawingStyle=Cylinder",
                IsValueShownAsLabel = true,
                Label = "#PERCENT{P1}",
                Legend = "Legend1",
                XValueMember = "Month",
                YValueMembers = "春日"
            };
            chart.Series.Add(series);

            series = new Series()
            {
                Name = "東雲",
                ChartType = SeriesChartType.StackedColumn,
                CustomProperties = "DrawingStyle=Cylinder",
                IsValueShownAsLabel = true,
                Label = "#PERCENT{P1}",
                Legend = "Legend1",
                XValueMember = "Month",
                YValueMembers = "東雲"
            };
            chart.Series.Add(series);

            series = new Series()
            {
                Name = "府中",
                ChartType = SeriesChartType.StackedColumn,
                CustomProperties = "DrawingStyle=Cylinder",
                IsValueShownAsLabel = true,
                Label = "#PERCENT{P1}",
                Legend = "Legend1",
                XValueMember = "Month",
                YValueMembers = "府中"
            };
            chart.Series.Add(series);

            series = new Series()
            {
                Name = "広島",
                ChartType = SeriesChartType.StackedColumn,
                CustomProperties = "DrawingStyle=Cylinder",
                IsValueShownAsLabel = true,
                Label = "#PERCENT{P1}",
                Legend = "Legend1",
                XValueMember = "Month",
                YValueMembers = "広島"
            };
            chart.Series.Add(series);

            ChartArea chartArea = new ChartArea()
            {
                Name = "ChartArea1",
                AxisY = new Axis() { Title = "売上高" },
                AxisX = new Axis() { Title = "売上月" }
            };
            chart.ChartAreas.Add(chartArea);            
        }
    }
}

Chart のサンプルは持っているでしょうか?

持っていなければ MSDN のサイトからサンプルを入手できるので、ダウンロードして動くように設定することをお勧めします。

解説が英語であるのを厭わなければこのサンプルは今後の開発に非常に有益なものになると思います。

このスレッドの質問者さんの問題がサンプルを見ると解決するかどうかは分かりませんが、解決のためのヒントはあるかもしれません。例えば下記:

イメージ説明

解決できなくとも、今後の開発に役立つはずですので、ダウンロードして設定する手間をかけても損はないと思います。

サンプルの入手先や設定手順は以下の記事にありますので、興味があれば見てください。

Chart Samples
http://surferonwww.info/BlogEngine/post/2016/02/14/chart-samples.aspx

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/25 11:46

    StackedColumn100を追加すると棒グラフも消えてしまうのです。
    EXECELだと折れ線グラフと積み上げも可能なようですがVB上では無理なのか ?

    キャンセル

  • 2018/09/25 15:37 編集

    Line と StackedColumn100 を同じ ChartArea 内に重ねて表示するというのは、自分が調べた限りですが、無理っぽいです。

    Chart の中に 2 つの ChartArea を上下並べて配置して片方に Line、他方に StackedColumn100 なら問題なくできると思いますが。

    キャンセル

  • 2018/09/25 15:57

    有難うございます。
    1) 折れ線グラフをベースに積上げグラフの追加
    2) 積上げグラフをベースに折れ線グラフの追加
    1),2)を試したのですが上手くいかないので断念します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • VBに関する質問
  • Chartで折れ線と100%積上げグラフを作成しているのですが積上げグラフが上手く表示出来ません