当下表中的criteria1
和criteria2
具有相同的值时,我遇到了气泡图问题。数据标签和数据系列相互重叠。在这种情况下,难以阅读它们。如何解决这个问题?
+------------+-----------+-----------+
| City | criteria1 | criteria2 |
+------------+-----------+-----------+
| Thane | 4 | 3 |
| Mumbai | 3 | 2 |
| Pune | 5 | 1 |
| Goa | 2 | 3 |
| Chandigarh | 3 | 1 |
+------------+-----------+-----------+
重叠问题
答案 0 :(得分:1)
你可以:
见https://stackoverflow.com/a/27813339/2707864(相关)。
对于自动化工作,我建议您使用真棒XY Chart Labeler并将其用作VBA代码的基础。所需的代码不会很短。我在这里给你一个原理图:
*看看它是如何工作的很有启发性,有时你可以选择一个用鼠标选择难以/不可能的对象。
答案 1 :(得分:1)
在图表旁边添加了一个用于调整数据标签的刷新按钮。下面是按钮背后的代码。
Sub MoveLabels()
Dim sh As Worksheet
Dim ch As Chart
Dim sers As SeriesCollection
Dim ser As Series
Dim i As Long, pt As Long
Dim dLabels() As DataLabel
Set sh = ActiveSheet
Set ch = sh.ChartObjects("Chart 1").Chart
Set sers = ch.SeriesCollection
ReDim dLabels(1 To sers.Count)
For pt = 1 To sers(1).Points.Count
For i = 1 To sers.Count
Set dLabels(i) = sers(i).Points(pt).DataLabel
Next
resetLabels dLabels
AdjustLabels dLabels ' This Sub is to deal with the overlaps
Next
End Sub
Private Sub AdjustLabels(ByRef v() As DataLabel)
Application.ScreenUpdating = False
Dim i As Long, j As Long, adj As Long
Dim temp_a As String, temp_b As String
For i = LBound(v) To UBound(v) - 1
For j = LBound(v) + 1 To UBound(v)
temp_a = v(i).Caption
temp_b = v(j).Caption
Debug.Print temp_a & " - | - " & temp_b
v(i).Caption = "a"
v(j).Caption = IIf(temp_a = temp_b, "a", "b")
ActiveSheet.ChartObjects("Chart 1").Activate
If ((v(j).Top = v(i).Top) And (v(i).Caption <> v(j).Caption) And (v(j).Left = v(i).Left)) Then
Select Case v(j).Position
Case xlLabelPositionAbove
v(j).Position = xlLabelPositionRight
Case xlLabelPositionRight
v(j).Position = xlLabelPositionBelow
Case xlLabelPositionBelow
v(j).Position = xlLabelPositionLeft
Case xlLabelPositionLeft
v(j).Position = xlLabelPositionAbove
End Select
End If
v(i).Caption = temp_a
v(j).Caption = temp_b
temp_a = vbNullString
temp_b = vbNullString
Next j, i
Application.ScreenUpdating = True
End Sub
Sub resetLabels(ByRef v() As DataLabel)
For i = LBound(v) To UBound(v) - 1
v(i).Position = xlLabelPositionAbove
Next
End Sub