Диаграмма Microsoft.Office.Interop.PowerPoint - со сломанной осью Y
Мы используем тип Interop PowerPoint Chart для создания диаграммы области, как показано на рисунке. Нам нужна "сломанная" ось Y. Мы не хотим перерыва на самих стержнях - нам нужен перерыв только по оси Y. Но не могут найти свойство или метод для достижения этой цели.
Это приложение Winforms. Был бы очень признателен за некоторые указатели...
1 ответ
Случайно наткнулся на этот вопрос, и я позволил своему любопытству победить. Я понял, как это сделано, взято с этого сайта.
Я использую пример данных с сайта выше для этого пошагового руководства.
Шаг примерно так:
- Назначьте значение среза для разделения данных. Разделите данные, используя значение среза (для примера я использую значение среза 7 500000)
Это разделение данных из примера (выше оригинал, ниже сепарат):
May June July
London 1,234,565 1,452,369 1,478,852
Paris 2,363,645 34,568,876 5,562,413
Madrid 32,645,254 3,211,654 5,857,421
Brussels 5,914,753 5,544,221 3,620,015
Lisbon 5,824,676 4,541,258 4,015,876
Munich 2,501,478 6,325,698 4,569,872
May June July Column4 Column5 Column6
London 1,234,565 1,452,369 1,478,852 0 0 0
Paris 2,363,645 7,500,000 5,562,413 0 34,568,876 0
Madrid 7,500,000 3,211,654 5,857,421 32,645,254 0 0
Brussels 5,914,753 5,544,221 3,620,015 0 0 0
Lisbon 5,824,676 4,541,258 4,015,876 0 0 0
Munich 2,501,478 6,325,698 4,569,872 0 0 0
приписывать
Column4
,Column5
, а такжеColumn6
во вторичную ось.Dim c As Microsoft.Office.Interop.PowerPoint.Chart Dim sc As Microsoft.Office.Interop.PowerPoint.SeriesCollection = Nothing Dim sr As Microsoft.Office.Interop.PowerPoint.Series = Nothing sc = c.SeriesCollection For i = 4 To sc.Count sr = sc.SeriesCollection(i) sr.AxisGroup = Microsoft.Office.Interop.PowerPoint.XlAxisGroup.xlSecondary Next
Измените масштаб Первичной и Вторичной осей, чтобы они соответствовали разметке диаграммы. Я изменяю масштаб первичной оси с 0 до 1.6e7, а масштаб вторичной оси с -7.0e7 до 7.0e7. В то же время измените единицу отображения на миллионы и удалите все линии сетки.
Dim ax As Microsoft.Office.Interop.PowerPoint.Axes Dim axpri As Microsoft.Office.Interop.PowerPoint.Axis Dim axsec As Microsoft.Office.Interop.PowerPoint.Axis ax = c.Axes axpri = ax.Item(Microsoft.Office.Interop.PowerPoint.XlAxisType.xlValue, _ Microsoft.Office.Interop.PowerPoint.XlAxisGroup.xlPrimary) axsec = ax.Item(Microsoft.Office.Interop.PowerPoint.XlAxisType.xlValue, _ Microsoft.Office.Interop.PowerPoint.XlAxisGroup.xlSecondary) axpri.MinimumScale = 0 axpri.MaximumScale = 1.6e7 axpri.DisplayUnit = Microsoft.Office.Interop.PowerPoint.XlDisplayUnit.xlMillions axpri.HasMajorGridlines = False axpri.HasMinorGridlines = False axsec.MinimumScale = -7.0e7 axsec.MaximumScale = 7.0e7 axsec.DisplayUnit = Microsoft.Office.Interop.PowerPoint.XlDisplayUnit.xlMillions axsec.HasMajorGridlines = False axsec.HasMinorGridlines = False
Измените числовой формат первичной и вторичной осей, чтобы каждая ось отображала только свое собственное заданное значение. Первичная ось более 8M не будет отображаться, а вторичная ось менее 30M не будет отображаться.
axpri.TickLabels.NumberFormat = "[<=8]0;;;" axsec.TickLabels.NumberFormat = "[>=30]0;;;"
Перекрасить ряды по вторичной оси, чтобы соответствовать рядам по первичной оси.
Dim srPrev As Microsoft.Office.Interop.PowerPoint.Series = Nothing For i = 4 To sc.Count sr = sc.SeriesCollection(i) srPrev = sc.SeriesCollection(i - 3) sr.Format.Fill.ForeColor.RGB = srPrev.Format.Fill.ForeColor.RGB Next
Удалить легенду для
Column4
,Column5
, а такжеColumn6
для бесшовной легенды диаграммы.c.Legend.LegendEntries(4).Delete() c.Legend.LegendEntries(5).Delete() c.Legend.LegendEntries(6).Delete()
[Необязательно] Добавьте аккуратный градиент цвета для точек данных, которые превышают значения выреза.
Dim p As Microsoft.Office.Interop.PowerPoint.Point = Nothing p = c.SeriesCollection("June").Points("Paris") p.Format.Fill.TwoColorGradient(Microsoft.Office.Core.MsoGradientStyle.msoGradientHorizontal, 1) p.Format.Fill.GradientAngle = 270 p.Format.Fill.GradientStops.Insert(p.Format.Fill.ForeColor.RGB, 0.8) p.Format.Fill.GradientStops.Insert(p.Format.Fill.BackColor.RGB, 0.97) p = c.SeriesCollection("May").Points("Madrid") p.Format.Fill.TwoColorGradient(Microsoft.Office.Core.MsoGradientStyle.msoGradientHorizontal, 1) p.Format.Fill.GradientAngle = 270 p.Format.Fill.GradientStops.Insert(p.Format.Fill.ForeColor.RGB, 0.8) p.Format.Fill.GradientStops.Insert(p.Format.Fill.BackColor.RGB, 0.97) p = c.SeriesCollection("Column5").Points("Paris") p.Format.Fill.TwoColorGradient(Microsoft.Office.Core.MsoGradientStyle.msoGradientHorizontal, 1) p.Format.Fill.GradientAngle = 90 p.Format.Fill.GradientStops.Insert(p.Format.Fill.ForeColor.RGB, 0.7) p.Format.Fill.GradientStops.Insert(p.Format.Fill.BackColor.RGB, 0.95) p = c.SeriesCollection("Column4").Points("Madrid") p.Format.Fill.TwoColorGradient(Microsoft.Office.Core.MsoGradientStyle.msoGradientHorizontal, 1) p.Format.Fill.GradientAngle = 90 p.Format.Fill.GradientStops.Insert(p.Format.Fill.ForeColor.RGB, 0.7) p.Format.Fill.GradientStops.Insert(p.Format.Fill.BackColor.RGB, 0.95)
Вуаля! Тяжелая работа окупается, ломаная ось Y на графике PowerPoint.