Добавление цветной полосы на диаграмму

Если я создам график рассеяния xy в Excel и использую Окрашивание каждой точки диаграммы на основе данных с использованием последовательных или расходящихся цветовых шкал для окрашивания точек в соответствии с некоторыми данными, как я могу добавить цветную полосу на диаграмму, чтобы показать цвет шкала? Например, как в MATLAB colorbar.


person Dan    schedule 17.03.2016    source источник


Ответы (1)


Полный пример на GitHub: https://github.com/DanGolding/Scatter-plot-with-color-grading-in-Excel


Для этого ответа я предполагаю, что вы использовали последний метод в этом ответе для окрашивания ваших данных. Другими словами, где-то на вашем листе у вас есть список троек RGB в 3 столбцах, по 1 цвету в строке. Так что-то вроде столбцов C - E на этом скриншоте:

введите здесь описание изображения

Стратегия создания цветной полосы состоит в том, чтобы создать ее на чистом листе, закрасив фон ячеек с очень короткой высотой строки, чтобы сделать цветную полосу, а затем использовать границу ячейки, чтобы сделать отметки. Метки делений будут использовать формулы, чтобы цветная полоса была динамической. Некоторые ячейки объединены из-за крошечной высоты строки. Все это автоматизируется следующим макросом. Затем мы создаем связанное изображение цветной полосы и размещаем его над нашей диаграммой.

Это макрос. Вам нужно внести пару изменений в зависимости от вашего листа. Например, в этом макросе данные, которые определяют окраску (то есть не сами цвета), находятся в диапазоне Colour Map (Divergent)'!I:I, который вам нужен для определения максимального и минимального значений вашей цветовой полосы. С расходящимися данными вы можете сделать эти значения одинаковыми (т.е. выбрать абсолютный максимум и его отрицательное значение). Также предполагается, что ваши тройки цветов находятся в столбцах C - E листа Colour Map (Divergent).

Запустите этот макрос на новом чистом листе:

Sub MakeColourBar()
    'NB!!! Only run this on a blank sheet!
    'NB!!! You need to put the min (Start), max (End) on the sheet yourself manually
    Range("A260").Value = "Start"
    Range("D260").Value = "=MIN('Colour Map (Divergent)'!I:I)"
    Range("A261").Value = "End"
    Range("D261").Value = "=MAX('Colour Map (Divergent)'!I:I)"
    Range("A262").Value = "Step"
    Range("D262").Value = "=(D261-D260)/8"

    Dim n as integer
    n = 256

    'This assumes there are RGB colour data on another sheet. Change the sheet name and columns below as needed
    Dim sheetMap As Worksheet
    Set sheetMap = Worksheets("Colour Map (Divergent)")
    Dim row As Integer
    For row = 1 To 256
        Range("B" & row + 1).Interior.color = RGB(sheetMap.Range("C" & n - row + 1).Value, sheetMap.Range("D" & n - row + 1).Value, sheetMap.Range("E" & n - row + 1).Value)
    Next row

    ActiveWindow.DisplayGridlines = False
    Rows("2:257").RowHeight = 2
    Rows("1:1").RowHeight = 7.5 'This is for the tick mark labels
    Rows("258:258").RowHeight = 7.5 'This is for the tick mark labels
    Columns("B:B").ColumnWidth = 2.14

    With Range("B2:B257")
        .Borders(xlEdgeTop).Weight = xlMedium
        .Borders(xlEdgeRight).Weight = xlMedium
        .Borders(xlEdgeBottom).Weight = xlMedium
        .Borders(xlEdgeLeft).Weight = xlMedium
    End With

    Range("D1:D6").Merge
    Range("D1").Value = "=D261"
    Range("D253:D258").Merge
    Range("D253").Value = "=D260"
    'Merge rows for tick marks
    Dim mark As Integer
    For mark = 1 To 8
        Range("C" & (mark - 1) * (256 / 8) + 2 & ":C" & (mark) * (256 / 8) + 1).Merge
        Range("C" & (mark - 1) * (256 / 8) + 2).Borders(xlEdgeTop).Weight = xlMedium
        'Make the tick mark labels by merging the 10 cells in column D that center around each tick label
        If mark > 1 Then
            Range("D" & (mark - 1) * (256 / 8) + 2 - 5 & ":D" & (mark - 1) * (256 / 8) + 2 + 4).Merge
            Range("D" & (mark - 1) * (256 / 8) + 2 - 5).Value = "=D" & (mark) * (256 / 8) + 2 - 5 & " + D262"
        End If
    Next mark
    Range("C257").Borders(xlBottom).Weight = xlMedium

    Columns("C:C").ColumnWidth = 0.42
    Columns("D:D").VerticalAlignment = xlCenter
    Columns("D:D").HorizontalAlignment = xlLeft

End Sub

Это создает следующее на вашем новом листе:

введите здесь описание изображения

Обратите внимание, что я вернул линии сетки для этого изображения только для того, чтобы проиллюстрировать, что здесь происходит. Но для того, чтобы это работало хорошо, вы должны отключить линии сетки, что и делает приведенный выше код. Линии сетки показывают, что цветная полоса просто состоит из столбца ячеек с фоновыми цветами, скорректированными с очень маленькой высотой строки (столбец B). Метки создаются с использованием границ объединенных ячеек (столбец C), а метки делений также используют объединенные ячейки, центрированные вокруг делений (столбец D).

Теперь выделите ячейки B3:D258 нового листа, скопируйте, а затем на лист с диаграммой вставьте как связанное изображение:

введите здесь описание изображения

На диаграмме измените размер области графика, чтобы справа от области диаграммы отображалось пустое пространство:

введите здесь описание изображения

И, наконец, измените размер связанного изображения (убедившись, что соотношение сторон остается постоянным!) и поместите его в это пустое пространство. Затем вы можете настроить размер шрифта столбца D вашего нового листа цветных полос, чтобы размеры чисел соответствовали размерам на вашей диаграмме.

Окончательный результат:

введите здесь описание изображения

person Dan    schedule 17.03.2016