Excel のグループ化された散布図、カテゴリ X 軸

Excel のグループ化された散布図、カテゴリ X 軸

カテゴリ別 X 軸を持つグループ化された散布図を作成しようとしています。私のデータと現在のグラフの試み:

ここに画像の説明を入力してください

すべての文字を、文字が重複しないように、同じ x 値を持つポイントとしてグループ化しようとしています...たとえば、すべての D が垂直に広がっています。

ここに画像の説明を入力してください

どうすればこれを実現できるでしょうか?

答え1

解決策は1つあります。Excel - 同じ x 値の上に異なる y 値をプロットする

どうやら、ラベルを数値に変換するのがコツのようです (おそらく、ms の名目データと順序データについて聞いたことがないのでしょう)。これは、ソートと cumsum カウンターを使用して簡単に実現できます。問題は、X 軸が数値であるため、前述のように手動で間隔を調整することは、大規模には実行できない可能性があることです。

別のアプローチは、データをカテゴリごとに 1 行にマージすることです。これは、数式または VBA のいずれかを使用して非常に簡単です。次に、散布図をテーブルに適用します。これにより、各列に虹色の図形を持つシリーズが作成されます。これらを同時に修正することは、適切な配列プロパティを使用して VBA で実行できるはずです (ドキュメントを調べていません)。さらに、プロットの生成中に空白があると混乱を招くようです。そのため、最初にこれらをプレースホルダー値 (-412613 など) に置き換え、プロットが生成されると、すべてのプレースホルダーを空白に置き換えて、それ以上の影響なしにグラフからプレースホルダーを削除しました。そのため、コーディングには 1 回限りの大きな費用がかかり、適用には 2 分かかります。

あるいは、より優れたプロット ソフトウェアを利用できる場合は、そうですね...


編集 (2019 年 6 月 30 日): リクエストに応じて、技術的な詳細を以下に詳しく説明します。ランダム化されたデータは、もともと A+C にあります。

合計:

B1=1 ; B2=if(a2=a1,b1,b1+1)

数式を使用して結合:

D1=1 ; D2 = if(a2=a1,0,1)
E1=if(index($a2:$a$999,column(a1),1)=$a1, _
      value(index($c2:$c$999,column(a1),1)),-0.413612)

すべての行に沿って、観測値の最大数と同じ数の列に E を貼り付けます。列のフィルターにプレースホルダーのみが表示されるかどうかがわかります。D=1 に従ってフィルターし、値を別のシートに貼り付けて、D を削除します。この方法は、より「クロスプラットフォーム」で、自由に動作するため、個人的には気に入っています。

代替案 - VBA を使用したマージ:

Const BASESHEET As String = "Base"
Const MERGESHEET As String = "Merge2"

Sub MergePairs()
Dim rowcnt As Long
Dim srcsht
Dim trgsht
Dim pid As String
Dim stidx As Long
Dim trgidx As Long
Set srcsht = Sheets(BASESHEET)
Set trgsht = Sheets(MERGESHEET)

' Sort the data.
srcsht.Sort.SortFields.Clear
srcsht.Sort.SortFields.Add Key:=Range("$A:$A"), _
    SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With srcsht.Sort
    .SetRange Range("$A:$C")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

' Copy unique ids.
rowcnt = srcsht.Cells(srcsht.Rows.Count, 1).End(xlUp).Row
srcsht.Range(srcsht.Cells(1, 1), srcsht.Cells(rowcnt, 1)).Copy
trgsht.Range("A1").PasteSpecial
trgsht.Range("$A:$A").RemoveDuplicates Columns:=1, Header:=xlNo

' Copy each set of points.
pid = ""
For i = 1 To rowcnt + 1
    If pid = "" Then
        pid = srcsht.Cells(i, 1).Value
        stidx = i
        trgidx = 1
    ElseIf pid <> srcsht.Cells(i, 1).Value Then
        srcsht.Range(srcsht.Cells(stidx, 3), srcsht.Cells(i - 1, 3)).Copy
        trgsht.Cells(trgidx, 2).PasteSpecial Paste:=xlPasteValues, _
            Operation:=xlNone, SkipBlanks:=False, Transpose:=True
        pid = srcsht.Cells(i, 1).Value
        stidx = i
        trgidx = trgidx + 1
    End If
Next i
End Sub

すべての値を選択してグラフを作成し、すべてのプレースホルダーを空白に置き換えることを忘れないでください。

すべてのマーカーを変更する: 散布図の軸ラベルは簡単に変更できないようです (変更する権限がまったくない可能性もあります)。対照的に、折れ線グラフの線を削除するのは簡単です。(注意: これにより、シート上のすべてのグラフが変更されるため、単独で実行するか、ループを parm に変更してください。)

Sub XChart()
Dim chrt As ChartObject
Dim ser As Excel.Series
For Each chrt In Worksheets("Merge1").ChartObjects
    chrt.Chart.ChartType = xlLine
    For Each ser In chrt.Chart.SeriesCollection
        ser.Format.Line.Visible = msoFalse
        ser.MarkerStyle = xlMarkerStyleX
        ser.MarkerForegroundColor = RGB(0, 0, 0)
        ser.MarkerBackgroundColor = RGB(255, 255, 255)
        ser.MarkerSize = 7
    Next ser
Next chrt
End Sub

次にデモンストレーション用の画像をいくつか紹介します。

選択フェーズ:

スパム

このデータで生成されたグラフ (プレースホルダーの一番下の行に注意してください):

スパム

プレースホルダーを空白に置き換える:

スパム

スパム

これが最終結果です。骨から活力がすべて吸い取られています。

最終結果


編集 (2020 年 4 月 24 日): 指摘されているように、Excel 2013 以降のバージョンでは、折れ線グラフの設定が値タイプの軸に変更されたようですが、表面上は変更する手段はありません。ただし、列/棒グラフでは (まだ) カテゴリ タイプの軸が使用されます。考えられるローテクなハックの 1 つは、説明されているように散布図/折れ線グラフを作成し、次にラベル + 0 値のみの 2 番目の棒グラフを作成することです。これにより空のグリッドが作成され、凡例、目盛りなどを削除して水平軸のみにすることができます。次に、散布図の数値範囲 (およそ 0/1 からラベルの数まで) と列の幅と位置を調整することで、見苦しいものの 2 つのグラフの位置合わせを行うことができます。 ローテク Worksheets("Merge").ChartObjects(1).Chart.Axes(xlCategory,xlPrimary) を通じて (Excel.) 軸への参照を取得することは可能です。この場合、値とカテゴリの違いは非常に明確です。ただし、試したプロパティ変更要求に応答しませんでした。

関連情報