Если я создам график рассеяния xy в Excel и использую Окрашивание каждой точки диаграммы на основе данных с использованием последовательных или расходящихся цветовых шкал для окрашивания точек в соответствии с некоторыми данными, как я могу добавить цветную полосу на диаграмму, чтобы показать цвет шкала? Например, как в MATLAB colorbar
.
Добавление цветной полосы на диаграмму
Ответы (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
вашего нового листа цветных полос, чтобы размеры чисел соответствовали размерам на вашей диаграмме.
Окончательный результат: