更改绘图区和图例的布局

可以通过使用 layout 类实例的 layout 属性来设置图表的布局。

表格布局

位置和大小

图表可以放置在容器中。可以通过 xy 调整位置。wh 调整大小。单位是容器的比例。 图表不能放置在容器的外部,并且宽度和高度是主要限制:如果 x+w>1,则 x=1-w。

x是从左侧开始的水平位置
y是从顶部开始的垂直位置
h是图表相对于其容器的高度
w是盒子(box)的宽度

模式

除了大小和位置外,相关属性的模式也可以设置为 factoredge。默认值为 factor:

layout.xMode = edge

目标(Target)

~layoutTarget` 属性可以设置成 outer 或者 inner. 默认值为 outer:

layout.layoutTarget = inner

图例布局

图例的位置可以通过设置位置参数来进行改变: rlt`、, ``btr,分别代表右、左、上、下以及右上。默认值为 r.

legend.position = 'tr'

或者应用手动布局:

legend.layout = ManualLayout()
from openpyxl import Workbook, load_workbook
from openpyxl.chart import ScatterChart, Series, Reference
from openpyxl.chart.layout import Layout, ManualLayout

wb = Workbook()
ws = wb.active

rows = [
    ['Size', 'Batch 1', 'Batch 2'],
    [2, 40, 30],
    [3, 40, 25],
    [4, 50, 30],
    [5, 30, 25],
    [6, 25, 35],
    [7, 20, 40],
]

for row in rows:
    ws.append(row)

ch1 = ScatterChart()
xvalues = Reference(ws, min_col=1, min_row=2, max_row=7)
for i in range(2, 4):
    values = Reference(ws, min_col=i, min_row=1, max_row=7)
    series = Series(values, xvalues, title_from_data=True)
    ch1.series.append(series)


ch1.title = "Default layout"
ch1.style = 13
ch1.x_axis.title = 'Size'
ch1.y_axis.title = 'Percentage'
ch1.legend.position = 'r'

ws.add_chart(ch1, "B10")

from copy import deepcopy

# Half-size chart, bottom right
ch2 = deepcopy(ch1)
ch2.title = "Manual chart layout"
ch2.legend.position = "tr"
ch2.layout=Layout(
    manualLayout=ManualLayout(
        x=0.25, y=0.25,
        h=0.5, w=0.5,
    )
)
ws.add_chart(ch2, "H10")

# Half-size chart, centred
ch3 = deepcopy(ch1)
ch3.layout = Layout(
    ManualLayout(
    x=0.25, y=0.25,
    h=0.5, w=0.5,
    xMode="edge",
    yMode="edge",
    )
)
ch3.title = "Manual chart layout, edge mode"
ws.add_chart(ch3, "B27")

# Manually position the legend bottom left
ch4 = deepcopy(ch1)
ch4.title = "Manual legend layout"
ch4.legend.layout = Layout(
    manualLayout=ManualLayout(
        yMode='edge',
        xMode='edge',
        x=0, y=0.9,
        h=0.1, w=0.5
    )
)

ws.add_chart(ch4, "H27")

wb.save("chart_layout.xlsx")

以上会创建四个图表并展示了各种可能性:

"Different chart and legend layouts"