# Surface charts

Data that is arranged in columns or rows on a worksheet can be plotted in a surface chart. A surface chart is useful when you want to find optimum combinations between two sets of data. As in a topographic map, colors and patterns indicate areas that are in the same range of values.

By default all surface charts are 3D. 2D wireframe and contour charts are created by setting the rotation and perspective.

    from openpyxl import Workbook
    from openpyxl.chart import (
        SurfaceChart,
        SurfaceChart3D,
        Reference,
        Series,
    )
    from openpyxl.chart.axis import SeriesAxis

    wb = Workbook()
    ws = wb.active

    data = [
        [None, 10, 20, 30, 40, 50,],
        [0.1, 15, 65, 105, 65, 15,],
        [0.2, 35, 105, 170, 105, 35,],
        [0.3, 55, 135, 215, 135, 55,],
        [0.4, 75, 155, 240, 155, 75,],
        [0.5, 80, 190, 245, 190, 80,],
        [0.6, 75, 155, 240, 155, 75,],
        [0.7, 55, 135, 215, 135, 55,],
        [0.8, 35, 105, 170, 105, 35,],
        [0.9, 15, 65, 105, 65, 15],
    ]

    for row in data:
        ws.append(row)

    c1 = SurfaceChart()
    ref = Reference(ws, min_col=2, max_col=6, min_row=1, max_row=10)
    labels = Reference(ws, min_col=1, min_row=2, max_row=10)
    c1.add_data(ref, titles_from_data=True)
    c1.set_categories(labels)
    c1.title = "Contour"

    ws.add_chart(c1, "A12")

    from copy import deepcopy

    # wireframe
    c2 = deepcopy(c1)
    c2.wireframe = True
    c2.title = "2D Wireframe"

    ws.add_chart(c2, "G12")

    # 3D Surface
    c3 = SurfaceChart3D()
    c3.add_data(ref, titles_from_data=True)
    c3.set_categories(labels)
    c3.title = "Surface"

    ws.add_chart(c3, "A29")

    c4 = deepcopy(c3)
    c4.wireframe = True
    c4.title = "3D Wireframe"

    ws.add_chart(c4, "G29")

    wb.save("surface.xlsx")