答案1
這是一種解決方案:Excel - 在相同的 x 值之上繪製不同的 y 值
看來訣竅在於將標籤轉換為數字(他們可能沒有聽說過關於毫秒的名義和序數數據,呃)。透過排序和累加計數器很容易實現這一點。問題是,X 軸是數位的,並且像上面建議的那樣手動調整間距可能在大範圍內不可行。
另一種方法是將資料合併到每個類別的一行中 - 這非常簡單,可以透過公式或 VBA - 然後將散佈圖套用到表中。這將為每個列建立一個系列,每個列都有彩虹色的形狀。我想,使用正確的陣列屬性在 vba 中同時修正這些應該是可行的(尚未檢查文件)。此外,在生成繪圖時有空白似乎會混淆它,因此我最初用佔位符值替換它們(例如-412613),然後,生成繪圖後,將所有佔位符替換為空白,方便地將它們從圖表中刪除沒有進一步的後果。因此,編碼的一次性成本較大,然後需要 2 分鐘才能應用。
或者,如果您可以使用更好的繪圖軟體,那麼...
編輯(30/06/19):根據要求,技術細節應在下面詳細說明。我的隨機數據最初位於 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
不要忘記建立一個選擇所有值的圖表,然後用空白取代所有佔位符。
更改所有標記:散佈圖上的軸標籤似乎不容易彎曲(甚至可能根本沒有這樣做的權限);相較之下,刪除折線圖上的線條就夠簡單了。 (請注意,這會更改工作表上的所有圖表,因此請確保它是單獨的或將循環修改為參數。)
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+版本似乎將折線圖設定更改為值類型軸,表面上沒有任何改變它的方法。但是,柱形/條形字元確實(仍然)使用類別類型軸;一種可能的低技術黑客方法是創建一個如上所述的散點圖/折線圖,然後創建第二個僅包含標籤+ 0 值的條形圖- 這會創建一個空網格,可以清除其中的圖例、刻度線等,僅留下水平軸。然後,透過調整散點的數值範圍(大致從 0 / 1 到標籤數量+)以及列的寬度和位置,可以對齊兩個圖表,儘管不美觀。 可以透過 Worksheets("Merge").ChartObjects(1).Chart.Axes(xlCategory,xlPrimary) 取得 (excel.) 軸的引用,其中值/類別差異非常清晰;儘管如此,它不會響應我嘗試過的任何屬性更改請求。