Добавьте одну точку данных в серию и укажите ее свойства в VBA. - PullRequest
0 голосов
/ 28 февраля 2020

Фон

Я получаю StdOut из python и анализирую информацию, поэтому у меня есть набор из N много (x, y) координат, принадлежащих M много серий. Я хотел бы иметь возможность наносить на график каждую точку по отдельности и контролировать их соответствующие свойства, т.е. цвет, форму, размер маркера и т. Д. c.

Однако все примеры, которые я до сих пор видел, связаны с необходимостью построения графика. все значения сразу, а затем l oop через серию. Моя желаемая функциональность выглядела бы как приведенный ниже псевдокод.

.SeriesCollection(seriesNumber).AddPoint(PtNum).xvalues = x
.SeriesCollection(seriesNumber).AddPoint(PtNum).values = y
.SeriesCollection(seriesNumber).Point(PtNum).markersize = some integer

Дополнительная информация

Данные, которые я получаю от python, соответствуют этому формату и хранятся в виде вариант.

SeriesName, Point# in the series, X or O, SeriesNumber, xcoord,ycoord, instance number

O представляет необходимость новой серии, X представляет уже существующую серию

номер экземпляра - количество повторений точки

Точка # Индекс точки координаты в серии

Пример строк данных

series1,1,O,1,0.25,64,1
series1,2,X,1,0.25,64,2
series2,1,O,2,0.3,90,1

Текущий код

    Dim pyData() As Variant

    pyData = Connect_2py.recv_Data(xArgs, yArgs, seriesArgs) 'exec python script and returns data
    For i = 0 To UBound(pyData) - 1

        py_lineData = Split(pyData(i), ",")
        createSeries = StrComp(py_lineData(2), "O", vbBinaryCompare) = 0
        seriesName = py_lineData(0)
        seriesNumber = CInt(py_lineData(3))

        If createSeries Then
            .SeriesCollection.NewSeries
            .SeriesCollection(seriesNumber).Name = seriesName
            Debug.Print ("Hooray new series has been made")
        End If

       'ENTER CODE HERE TO ADD EACH DATAPOINT TO A SPECIFIED SERIES
    Next

1 Ответ

1 голос
/ 28 февраля 2020

ОК, так что, кажется, выполнимо. Я был удивлен, что расширение точечных массивов серии не потеряло существующие свойства маркера.

Sub Tester()
    Const N = 10
    Dim i As Long, x(), y(), sz(), cht As Chart, ser As Series

    ReDim x(1 To N)
    ReDim y(1 To N)
    ReDim sz(1 To N)

    'create some initial data
    For i = 1 To 10
        x(i) = i
        y(i) = i ^ 1.5
        sz(i) = 2 + (Rnd() * 10)
    Next i

    'create a series, populate with the initial data
    '   and set some marker sizes
    Set cht = ActiveSheet.ChartObjects(1).Chart
    Set ser = cht.SeriesCollection.NewSeries()
    With ser
        .XValues = x
        .Values = y
        For i = 1 To 10
            .Points(i).MarkerSize = sz(i)
        Next i
    End With

    'extend that series one point at a time
    For i = 1 To 5
        ExtendSeries ser, i * 10, i * 10, i * 5
    Next i

End Sub

'Extend the data in a series by adding a new X/Y pair
'Also shows how to configure (eg) the added point size 
Sub ExtendSeries(ser As Series, xVal, yVal, sz)
    Dim x, y, newlen As Long
    With ser
        x = .XValues
        y = .Values
        newlen = UBound(x) + 1

        ReDim Preserve x(newlen)
        x(newlen) = xVal

        ReDim Preserve y(UBound(x) + 1)
        y(newlen) = yVal

        .XValues = x
        .Values = y
        '.Points(newlen).MarkerSize = sz        'edit: for some reason this doesn't work...
        .Points(.Points.Count).MarkerSize = sz  '...but this does
    End With
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...