答え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.) 軸への参照を取得することは可能です。この場合、値とカテゴリの違いは非常に明確です。ただし、試したプロパティ変更要求に応答しませんでした。