Диаграмма Microsoft.Office.Interop.PowerPoint - со сломанной осью Y

Мы используем тип Interop PowerPoint Chart для создания диаграммы области, как показано на рисунке. Нам нужна "сломанная" ось Y. Мы не хотим перерыва на самих стержнях - нам нужен перерыв только по оси Y. Но не могут найти свойство или метод для достижения этой цели.

Это приложение Winforms. Был бы очень признателен за некоторые указатели...Диаграмма с ломаной осью Y

1 ответ

Случайно наткнулся на этот вопрос, и я позволил своему любопытству победить. Я понял, как это сделано, взято с этого сайта.

Я использую пример данных с сайта выше для этого пошагового руководства.

Шаг примерно так:

  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
  1. приписывать 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
    
  2. Измените масштаб Первичной и Вторичной осей, чтобы они соответствовали разметке диаграммы. Я изменяю масштаб первичной оси с 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
    
  3. Измените числовой формат первичной и вторичной осей, чтобы каждая ось отображала только свое собственное заданное значение. Первичная ось более 8M не будет отображаться, а вторичная ось менее 30M не будет отображаться.

    axpri.TickLabels.NumberFormat = "[<=8]0;;;"
    axsec.TickLabels.NumberFormat = "[>=30]0;;;"
    
  4. Перекрасить ряды по вторичной оси, чтобы соответствовать рядам по первичной оси.

    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
    
  5. Удалить легенду для Column4, Column5, а также Column6 для бесшовной легенды диаграммы.

    c.Legend.LegendEntries(4).Delete()
    c.Legend.LegendEntries(5).Delete()
    c.Legend.LegendEntries(6).Delete()
    
  6. [Необязательно] Добавьте аккуратный градиент цвета для точек данных, которые превышают значения выреза.

    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)
    
  7. Вуаля! Тяжелая работа окупается, ломаная ось Y на графике PowerPoint.

Другие вопросы по тегам