Как добавить цветные вертикальные полосы в диаграмме Excel с Python - PullRequest
0 голосов
/ 18 октября 2018

Я хотел бы создать график, подобный следующему, используя openpyxl :

enter image description here

Чтобы создать его, я следовалподход , объединяющий линейный график с гистограммой , где столбцы отформатированы, чтобы быть фоновыми вертикальными полосами.

Я был очень близок к достижению этого, но я не смог:

  • скрытие отметок вторичной оси y
  • скрытие основных линий сетки вторичной оси y
  • делает цвет вертикальных полос прозрачным, поэтому основныевидны линии сетки первичной оси y

Мне удалось получить следующий результат с перечисленными выше проблемами:

sad plot

Ниже приведен код, который создает приведенную выше диаграмму (с использованием openpyxl 2.3.5 и Python 2.7.11):

from openpyxl import Workbook
from openpyxl.chart import BarChart
from openpyxl.chart import LineChart
from openpyxl.chart import Reference
from openpyxl.chart.data_source import NumFmt
from openpyxl.chart.marker import DataPoint
from openpyxl.chart.series_factory import SeriesFactory
from openpyxl.chart.axis import TextAxis
from openpyxl.chart.shapes import GraphicalProperties


workbook = Workbook()
worksheet = workbook.active

rows = [
    ['region', 'value', 'index', 'unity'],
    ['A1', 0.9, 1, 1],
    ['A2', 1.1, 2, 1],
    ['B1', 1.6, 3, 1],
    ['C1', 0.9, 4, 1],
    ['D1', 1.0, 5, 1],
    ['D2', 1.0, 6, 1],
    ['E1', 0.9, 7, 1],
]

for row in rows:
    worksheet.append(row)

verticalbands = BarChart()
verticalbands.type = "col"
verticalbands.grouping = "stacked"
verticalbands.overlap = 100
verticalbands.gapWidth = 0

colours = ["c4bedf", "c4bedf", "d6d8b4", "98d4e4", "e6b8b3", "e6b8b3", "aad2bf"]
xvalues = Reference(worksheet, min_col=3, min_row=2, max_row=8)
data = Reference(worksheet, min_col=4, min_row=2, max_row=8)
series = SeriesFactory(data)
verticalbands.x_axis = TextAxis()
verticalbands.set_categories(xvalues)
verticalbands.series.append(series)

for i, colour in zip(range(9), colours):
    pt = DataPoint(idx=i)
    pt.graphicalProperties = GraphicalProperties(solidFill=colour)
    series.dPt.append(pt)

verticalbands.y_axis.numFmt = NumFmt(formatCode=";")  #  hide value, see https://www.ablebits.com/office-addins-blog/2016/07/07/custom-excel-number-format/
verticalbands.y_axis.scaling.min = 0
verticalbands.y_axis.scaling.max = 1
verticalbands.y_axis.majorTickMark = None
verticalbands.y_axis.minorTickMark = None

data_chart = LineChart()
xvalues = Reference(worksheet, min_col=1, min_row=2, max_row=8)
yvalues = Reference(worksheet, min_col=2, min_row=1, max_row=8)
series = SeriesFactory(yvalues, title_from_data=True)
series.marker.symbol = 'circle'
series.marker.size = 4
series.marker.graphicalProperties.solidFill = "4F81BD"
series.marker.graphicalProperties.line.noFill = True
series.graphicalProperties.line.noFill = True
data_chart.series.append(series)
data_chart.x_axis = TextAxis()
data_chart.set_categories(xvalues)

verticalbands.y_axis.crosses = 'max'
verticalbands.y_axis.axId = 200

verticalbands += data_chart

worksheet.add_chart(verticalbands, "A12")

workbook.save('~/file.xlsx)

Обидно, что эти строки не дают желаемого эффекта:

verticalbands.y_axis.majorTickMark = None
verticalbands.y_axis.minorTickMark = None

Чтобы увидеть проблему, мне нужно вручную установить прозрачность самой правой полосы на50%:

enter image description here

Было бы здорово просто "удалить" ось:

verticalbands.y_axis.delete = True

, но это просто нарушаетдиаграмма:

enter image description here

Для прозрачности я попытался использовать 8-символьные шестнадцатеричные цвета RGB , но параметр solidFill в GraphicalProperties не может принимать цвета, такие как 00FF0000, что приводит к неверному файлу, который Excel не может открыть.

Есть идеи, как решить эти проблемы?

...