[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『縦軸:利益率、横軸:売上の面積グラフ作成方法』(littecub_703)
縦軸:利益率、横軸:売上の面積グラフは
Excelで作成可能でしょうか。
いくつかの事業のデータを置いて、
直感的にどの事業が多く利益を出しているかを
わかるようにしたいと考えています。
可能な場合、その作成方法をご教授いただければ幸いです。
不可能or作成方法が判明しない場合、
有料でも構いませんので、
そのようなグラフを作成可能なソフトをご存知でしたら
そちらについてご教授いただければと思います。
以上、宜しくお願いいたします。
< 使用 Excel:Excel2010、使用 OS:Windows7 >
それとも
散布図にしたいのかな
https://software.ssri.co.jp/statweb2/tips/tips_6.html
ご参考に
(11) 2016/12/07(水) 15:32
(γ) 2016/12/07(水) 16:35
円の大きさが面積か
すごい洞察力
ぴんと来なかった
暇だったからなにげに考えてたんだけど
(11) 2016/12/07(水) 16:42
技量不足のため掲示板で再現するのが難しいのですが
下記で上手く伝わりますでしょうか。
利 -----
益 |AAAA|
率 |AAAA|----------
軸 |AAAA|BBBBBBBBBB|
------------------------------売上軸
| | | C | |____|
このようなグラフをイメージしており、
例えば
A事業は売上そこそこで利益率が高いので利益額(面積)が大きい
Bは売上は大きいものの、利益率が低く利益額はそれほどでもない
Cは売上はそこそこだが、大きく赤字になっている
といったことが、直感的にわかればと考えています。
(littecub_703) 2016/12/07(水) 16:55
http://www.nikkeibp.co.jp/article/nba/20100331/218614/?P=1
面積グラフ エクセルで 出てくると思いますよ
(11) 2016/12/07(水) 17:23
縦軸は利益率の最大と最小で高さが決まり、横軸は売上合計で幅が決まるでしょう。個々のデータから割合を求め座標計算すれば良さそう。
コーディングするのは面倒だし、元データが判らないとさっぱりなので、コードは書きません。
事業数が少ないならば、手作業で図形の面積を操作して、レイアウトするだけで表現できそうです。
(???) 2016/12/07(水) 17:29
量率グラフにかなり近いものになりますが、
赤字の事業もあるため、試してみたシェアウェアでは
なかなかうまく描けません。。。
やはり手作業で図形を並べるしかないでしょうか。
このようなグラフを作成できる市販ソフトがあれば、とも
思うのですが、なかなかありませんかね。
別途開発するよりは安く済むと考えているのですが。
(littecub_703) 2016/12/07(水) 18:29
(γ) 2016/12/07(水) 20:30
(水上) 2016/12/07(水) 20:37
とりあえず、元データのレイアウトが判らないので、以下と仮定したマクロ例を書きます。
A B C 1 事業 売上 利益率 2 A 40 30% 3 B 100 10% 4 C 10 -10%
例えば、E:S列のセル幅2にしておいてください。セルの大きさに合わせて罫線を引きますので、これが目盛線になります。
上下左右に空間を空けずに描いたので、余白を作りたい場合は、コード中の罫線描画部分を消し、手作業で罫線を引いておくと良いでしょう。
Sub test() Dim S As Shape Dim i As Long Dim iMax As Long Dim iUriW As Single Dim iRiekiU As Single Dim iRiekiH As Single Dim iTop As Single Dim iLeft As Single Dim iWidth As Single Dim iHeight As Single
For Each S In Shapes If S.Type = msoAutoShape Then S.Delete End If Next S
iMax = Cells(Rows.Count, "A").End(xlUp).Row With WorksheetFunction iUriW = .Sum(Range("B2:B" & iMax)) iRiekiU = .Min(Range("C2:C" & iMax)) iRiekiH = .Max(Range("C2:C" & iMax)) - .Min(iRiekiU, 0) End With
With Range("E2:S9") With .Borders .LineStyle = xlContinuous .Color = RGB(128, 128, 128) .Weight = 2 End With .Borders(xlInsideVertical).LineStyle = xlDot .Borders(xlInsideHorizontal).LineStyle = xlDot
iLeft = .Left For i = 2 To iMax iWidth = .Width * Cells(i, "B").Value / iUriW iHeight = .Height * Abs(Cells(i, "C").Value) / iRiekiH If Cells(i, "C").Value < 0 Then iTop = .Top + .Height - iHeight Else iTop = .Top + .Height - iHeight + .Height * iRiekiU / iRiekiH End If Call sShapeAdd(iLeft, iTop, iWidth, iHeight, _ (Array(RGB(0, 0, 0), RGB(0, 0, 0), RGB(0, 0, 0))(i - 2)), _ (Array(RGB(0, 0, 255), RGB(0, 255, 0), RGB(255, 0, 0))(i - 2)), _ (Array(RGB(0, 0, 128), RGB(0, 128, 0), RGB(128, 0, 0))(i - 2)), _ (Array(RGB(0, 0, 32), RGB(0, 32, 0), RGB(32, 0, 0))(i - 2))) iLeft = iLeft + iWidth Next i End With End Sub
Sub sShapeAdd(iLeft As Single, iTop As Single, iWidth As Single, iHeight As Single, iRGB0 As Long, iRGB1 As Long, iRGB2 As Long, iRGB3 As Long) With ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, iLeft, iTop, iWidth, iHeight) With .Fill .ForeColor.RGB = iRGB0 .OneColorGradient msoGradientHorizontal, 1, 1 With .GradientStops .Insert 0, 0 .Item(1).Color.RGB = iRGB1 .Item(2).Color.RGB = iRGB2 .Item(3).Color.RGB = iRGB3 .Item(1).Position = 0.3 .Item(2).Position = 0.5 .Item(3).Position = 0.8 End With .GradientAngle = 0 End With With .Line .Weight = 1 .ForeColor.RGB = RGB(0, 0, 0) End With End With End Sub (???) 2016/12/08(木) 11:29
バブルチャートのご提案ありがとうございます。
確かに標準的な手法の方がなにかと良いですよね。
ただし、今回に限っては
上記のような四角形が横にならぶイメージでないと
いけない事情がありますので、
別の方法を検討したいと思います。
水上様
日付軸のご提案ありがとうございます。
手作業で図形を並べる方法もアリですが、
こちらのほうが綺麗に並べることが出来そうです。
???様
マクロまでありがとうございます!
こちら試してみてまたお返事させていただきます。
取り急ぎお礼まで。
(littecub_703) 2016/12/08(木) 11:47
・記述いただいたものと同じ形でデータを入力
・記述いただいたマクロをコピペしてマクロ実行
といたしましたが、
「実行時エラー424 オブジェクトが必要です」と出ます。
「デバック」を押すと
For Each S In Shapes がハイライトされている状況です。
マクロ知識が皆無なので大変恐縮ですが、
対応方法ご教授いただけますでしょうか。
何卒宜しくお願いいたします。
(littecub_703) 2016/12/08(木) 12:02
シートモジュールに貼りなおしたところ、うまくいきました。
ありがとうございます!
どこをどう修正すると対象データ件数を増やせるのか、
オブジェクトの形や色を変更できるのか、
今後の為にも勉強しようと思います。
お忙しいところ、ありがとうございました!
(littecub_703) 2016/12/08(木) 12:53
先のデータに加えて、A列「事業」のセルを、それぞれ好きな色で塗りつぶしておいてください。
そして、マクロは以下のものに差し替えてください。
Sub test() Dim S As Shape Dim i As Long Dim iMax As Long Dim iUriW As Single Dim iRiekiU As Single Dim iRiekiH As Single Dim iTop As Single Dim iLeft As Single Dim iWidth As Single Dim iHeight As Single
For Each S In Shapes If S.Type = msoAutoShape Then S.Delete End If Next S
iMax = Cells(Rows.Count, "A").End(xlUp).Row With WorksheetFunction iUriW = .Sum(Range("B2:B" & iMax)) iRiekiU = .Min(Range("C2:C" & iMax)) iRiekiH = .Max(Range("C2:C" & iMax)) - .Min(iRiekiU, 0) End With
With Range("E2:S9") With .Borders .LineStyle = xlContinuous .Color = RGB(128, 128, 128) .Weight = 2 End With .Borders(xlInsideVertical).LineStyle = xlDot .Borders(xlInsideHorizontal).LineStyle = xlDot
iLeft = .Left For i = 2 To iMax iWidth = .Width * Cells(i, "B").Value / iUriW iHeight = .Height * Abs(Cells(i, "C").Value) / iRiekiH If Cells(i, "C").Value < 0 Then iTop = .Top + .Height - iHeight Else iTop = .Top + .Height - iHeight + .Height * iRiekiU / iRiekiH End If Call sShapeAdd(iLeft, iTop, iWidth, iHeight, Cells(i, "A").Interior.Color) iLeft = iLeft + iWidth Next i End With End Sub
Sub sShapeAdd(iLeft As Single, iTop As Single, iWidth As Single, iHeight As Single, iRGB As Long) With ActiveSheet.Shapes.AddShape(msoShapeRoundedRectangle, iLeft, iTop, iWidth, iHeight) With .Fill .ForeColor.RGB = RGB(0, 0, 0) .OneColorGradient msoGradientHorizontal, 1, 1 With .GradientStops .Insert 0, 0 .Item(1).Color.RGB = iRGB .Item(2).Color.RGB = (iRGB And &HFE0000) / 2 + (iRGB And &HFE00&) / 2 + (iRGB And &HFE&) / 2 .Item(3).Color.RGB = (iRGB And &HFC0000) / 4 + (iRGB And &HFC00&) / 4 + (iRGB And &HFC&) / 4 .Item(1).Position = 0.3 .Item(2).Position = 0.5 .Item(3).Position = 0.8 End With .GradientAngle = 0 End With With .Line .Weight = 1 .ForeColor.RGB = RGB(0, 0, 0) End With End With End Sub (14:06 RGB計算式を簡略化) (???) 2016/12/08(木) 13:39
すごい!ますます便利になりました!
こんなのがさらっと作れるなんて憧れます。
個人の趣味としては
・角ありの四角
・色は単色
にしたいと思いますので、
頑張ってマクロを編集してみます。
本当に助かりました。
ありがとうございました。
(littecub_703) 2016/12/08(木) 16:32
msoShapeRoundedRectangle の部分が、角丸四角の指定になります。Roundedが付かないものが、普通の四角形です。
また、角丸のままで .Adjustments.Item(1) = 0.1 とか指定すると、丸の径が小さくなったりも可能。
単色で良いならば、OneColorGradientのあたりを変えて(消して)みてください。グラデ関係がごっそり消せるはず。(.Fill.ForeColor.RGB だけ指定で単色かな? 単色は面積表現部分が大きいので、かなり寂しい感じになりますよ?)
どういう風に直すかは、マクロの自動記録を使って、手作業するのをマクロ化させれば、キーワードを知る事ができるでしょう。
(???) 2016/12/08(木) 17:42
バブルチャートでは、
・事業ごとの、売上、利益率などの他事業との比較は、
散布図と同じですから、直感的にわかります。
・面積の大小は、円という相似形ですから直感的な比較が可能です。
> A事業は売上そこそこで利益率が高いので利益額(面積)が大きい
> Bは売上は大きいものの、利益率が低く利益額はそれほどでもない
> Cは売上はそこそこだが、大きく赤字になっている
> といったことが、直感的にわかればと考えています。
というリクエストに応えていると思うのですが、いかがですか?
2016/12/07(水) 16:55 で示されたグラフで、
大きさの比較が直感的にできますか?
縦長だったり、正方形に近かったりするわけですが、
そうしたものの面積の大小比較があなたには直感的にできるのですか?
売上と利益率の要素は、横軸と縦軸とに
投影されているのですから、面積は単にその大きさだけが
わかればいいはずで、
面積を構成する2要素の内容は見なくてよいはずなんです。
(Q1)「2016/12/07(水) 16:55 で示されたグラフでなければ得られない視点」が
あり、バブルチャートにはそれが無いから使えない、ということですか?
だとしたら、それはいったいどんな視点なのですか?
(Q2)そして、そのことはあなたの質問事項に述べられていることなんですか?
後学のために是非教えてください。
(Q3)バブルチャートを実際に書いてみていますか?
どちらがわかりやすいかと、周囲の意見も聞いていますか?
思わず力が入ってしまったが、どうぞご教示くださいませ。
(γ) 2016/12/08(木) 21:21
(水上) 2016/12/09(金) 07:46
全マイナスもあり得るので、どう直すかちょっと考えてみます。
(???) 2016/12/09(金) 10:54
Sub test() Dim S As Shape Dim i As Long Dim iMax As Long Dim iUriW As Single Dim iRiekiU As Single Dim iRiekiH As Single Dim iTop As Single Dim iLeft As Single Dim iWidth As Single Dim iHeight As Single Dim iZero As Single
For Each S In Shapes If S.Type = msoAutoShape Then S.Delete End If Next S
iMax = Cells(Rows.Count, "A").End(xlUp).Row With WorksheetFunction iUriW = .Sum(Range("B2:B" & iMax)) iRiekiU = .Min(Range("C2:C" & iMax)) iRiekiH = .Max(.Max(Range("C2:C" & iMax)), 0) - .Min(iRiekiU, 0) iZero = .Max(0, -iRiekiU) End With
With Range("E2:S9") With .Borders .LineStyle = xlContinuous .Color = RGB(128, 128, 128) .Weight = 2 End With .Borders(xlInsideVertical).LineStyle = xlDot .Borders(xlInsideHorizontal).LineStyle = xlDot
iZero = .Height * iZero / iRiekiH iLeft = .Left For i = 2 To iMax iWidth = .Width * Cells(i, "B").Value / iUriW iHeight = .Height * Abs(Cells(i, "C").Value) / iRiekiH iTop = .Top + .Height - iZero - IIf(Cells(i, "C").Value < 0, 0, iHeight) Call sShapeAdd(iLeft, iTop, iWidth, iHeight, Cells(i, "A").Interior.Color) iLeft = iLeft + iWidth Next i End With End Sub (???) 2016/12/09(金) 11:32
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.