เพิ่มเส้นแนวโน้มในแผนภูมินำเสนอด้วย Python

ภาพรวม

บทความนี้อธิบายวิธีการเพิ่มเส้นแนวโน้มลงในแผนภูมินำเสนอโดยใช้ Aspose.Slides โดยจะแสดงวิธีสร้างแผนภูมิ, เพิ่มเส้นแนวโน้มให้กับชุดข้อมูลของแผนภูมิ, และทำงานกับประเภทเส้นแนวโน้มต่าง ๆ ได้แก่ เชิงเอ็กซ์โพเนนเชียล, เชิงเส้น, ลอการิทึม, ค่าเฉลี่ยเคลื่อนที่, พหุนาม, และพาวเวอร์

นอกจากนี้ยังอธิบายวิธีเพิ่มเส้นแบบกำหนดเองลงในแผนภูมิโดยการแทรกรูปทรงเส้น และรวมคำถามที่พบบ่อยสั้น ๆ เกี่ยวกับค่าการฉายเส้นแนวโน้มไปข้างหน้าและถอยหลังว่าเป็นอย่างไร และเส้นแนวโน้มจะคงอยู่หรือไม่เมื่อนำเสนอไปยัง PDF หรือ SVG หรือเมื่อตัวแปลงแผนภูมิเป็นรูปภาพ

เพิ่มเส้นแนวโน้ม

ใช้ TrendlineCollection.add เพื่อเพิ่มเส้นแนวโน้มให้กับชุดข้อมูลของแผนภูมิ โดยเลือกประเภทผ่าน TrendlineType. ตัวอย่างสร้างแผนภูมิเชิงคอลัมน์แบบกลุ่มโดยใช้ข้อมูลค่าเริ่มต้นและเพิ่มเส้นแนวโน้มสองเส้นให้กับแต่ละชุดข้อมูลจำนวนสามชุด

เส้นแนวโน้มเชิงเอ็กซ์โพเนนเชียลซ่อนสมการและค่า R‑squared ผ่าน setDisplayEquation และ setDisplayRSquaredValue ขณะที่เส้นแนวโน้มเชิงเส้นเป็นสีแดง เส้นแนวโน้มเชิงลอการิทึมใช้ addTextFrameForOverriding เพื่อกำหนดป้ายกำกับแบบกำหนดเอง ค่าเฉลี่ยเคลื่อนที่ใช้ setPeriod เป็นสามจุดข้อมูลและกำหนดชื่อผ่าน setTrendlineName

เส้นแนวโน้มพหุนามมีลำดับเป็นสามกำหนดโดย setOrder และขยายหนึ่งหมวดหมู่ต่อไปข้างหน้าโดย setForward เส้นแนวโน้มพาวเวอร์ขยายหนึ่งหมวดหมู่ถอยหลังโดย setBackward

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ChartType, FillType, Presentation, SaveFormat, TrendlineType
from java.awt import Color

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 20, 20, 500, 400)

    first_series = chart.getChartData().getSeries().get_Item(0)

    exponential_trendline = first_series.getTrendLines().add(TrendlineType.Exponential)
    exponential_trendline.setDisplayEquation(False)
    exponential_trendline.setDisplayRSquaredValue(False)

    linear_trendline = first_series.getTrendLines().add(TrendlineType.Linear)
    linear_trendline.getFormat().getLine().getFillFormat().setFillType(FillType.Solid)
    linear_trendline.getFormat().getLine().getFillFormat().getSolidFillColor().setColor(Color.RED)

    second_series = chart.getChartData().getSeries().get_Item(1)

    logarithmic_trendline = second_series.getTrendLines().add(TrendlineType.Logarithmic)
    logarithmic_trendline.addTextFrameForOverriding("New log trend line")

    moving_average_trendline = second_series.getTrendLines().add(TrendlineType.MovingAverage)
    moving_average_trendline.setPeriod(jpype.JByte(3))
    moving_average_trendline.setTrendlineName("New TrendLine Name")

    third_series = chart.getChartData().getSeries().get_Item(2)

    polynomial_trendline = third_series.getTrendLines().add(TrendlineType.Polynomial)
    polynomial_trendline.setForward(1)
    polynomial_trendline.setOrder(jpype.JByte(3))

    power_trendline = third_series.getTrendLines().add(TrendlineType.Power)
    power_trendline.setBackward(1)

    presentation.save("ChartTrendLines.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

กำหนดจุดตัดแกนของเส้นแนวโน้ม

ใช้ setIntercept เพื่อกำหนดค่า Y ของเส้นแนวโน้มเมื่อ X = 0 การตั้งค่านี้สนับสนุนสำหรับเส้นแนวโน้มเชิงเส้น, เชิงเอ็กซ์โพเนนเชียล, และพหุนาม

ตัวอย่างเช่น โมเดลต้นทุนการผลิตอาจต้องเริ่มต้นที่ค่าใช้จ่ายคงที่ที่ทราบไว้ 100 แม้ว่าข้อมูลที่วัดที่ปริมาณการผลิตที่ไม่เป็นศูนย์จะบ่งบอกฐานข้อมูลที่ต่างออกไป สำหรับเส้นแนวโน้มเชิงเส้น การกำหนดจุดตัดทำให้สมการ y = ax + b กลายเป็น b = 100; ความชันจะถูกฟิตตามข้อมูลภายใต้เงื่อนไขนั้น ไม่ได้เพียงแค่ย้ายเส้นที่ฟิตแล้วตั้งค่า การตั้งค่าการตัดแกนจะกำหนดตำแหน่งที่แกนของแผนภูมิกัน, ไม่ใช่ค่าสัมประสิทธิ์ของเส้นแนวโน้มที่ฟิตแล้ว

ตัวอย่างต่อไปสร้างแผนภูมิกระจาย (XY) โดยใช้ปริมาณการผลิตตั้งแต่ 1 ถึง 4 และต้นทุน 170, 200, 230, และ 260 บันทึกแผนภูมิด้วยการคำนวณจุดตัดอัตโนมัติเริ่มต้น, จากนั้นกำหนดจุดตัดเป็น 100 และบันทึกเป็นไฟล์ PPTX ที่สอง ทั้งสองไฟล์ต่างกันเฉพาะค่า การตั้งค่าจุดตัด จุดตัดเส้นแนวโน้มจะแสดงสมการและขยายกลับไปที่ X = 0

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ChartType, Presentation, SaveFormat, TrendlineType

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.ScatterWithMarkers, 20, 20, 480, 210)
    chart.setLegend(False)

    chart.getChartData().getSeries().clear()
    chart.getChartData().getCategories().clear()

    workbook = chart.getChartData().getChartDataWorkbook()
    workbook.clear(0)

    name_cell = workbook.getCell(0, 0, 1, "Production cost")
    series = chart.getChartData().getSeries().add(name_cell, ChartType.ScatterWithMarkers)
    costs = [170, 200, 230, 260]

    for i in range(len(costs)):
        x_cell = workbook.getCell(0, i + 1, 0, i + 1)
        y_cell = workbook.getCell(0, i + 1, 1, costs[i])
        series.getDataPoints().addDataPointForScatterSeries(x_cell, y_cell)

    trendline = series.getTrendLines().add(TrendlineType.Linear)
    trendline.setDisplayEquation(True)
    trendline.setBackward(1)

    presentation.save("AutomaticIntercept.pptx", SaveFormat.Pptx)

    trendline.setIntercept(100)
    presentation.save("FixedIntercept.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

เมื่อคำนวณอัตโนมัติ ข้อมูลเหล่านี้ให้ผลลัพธ์ y = 30x + 140 การตั้งค่าจุดตัดเป็น 100 แทนจะให้ผลลัพธ์ประมาณ y = 43.33x + 100: ค่าที่ฟิตที่ศูนย์ตรงกับฐานข้อมูลที่ทราบไว้, ในขณะที่เส้นจะไม่ผ่านทุกจุดข้อมูลอีกต่อไป

การตัดแกนอัตโนมัติ การตัดแกนที่ตั้งค่าเป็น 100
เส้นแนวโน้มเชิงเส้นที่คำนวณจุดตัดอัตโนมัติเป็น 140 เส้นแนวโน้มเชิงเส้นที่ตั้งค่าจุดตัดเป็น 100

ภาพทั้งสองใช้ข้อมูลและสเกลแกนเดียวกัน เส้นแนวโน้มถูกขยายกลับไปที่ X = 0 เพื่อแสดงจุดตัดของมัน

โดยค่าเริ่มต้น, getIntercept จะคืนค่า NaN ซึ่งหมายถึงจุดตัดที่ไม่ได้ระบุ ไม่ใช่ศูนย์ จากนั้นจุดตัดจะถูกคำนวณโดยอัตโนมัติจากข้อมูล

เพิ่มเส้นที่กำหนดเอง

เส้นที่กำหนดเองเป็นรูปทรงที่วาดเหนือแผนภูมิแทนที่จะเป็นเส้นแนวโน้มที่คำนวณจากข้อมูลชุดข้อมูล ตัวอย่างนี้ใช้ ShapeCollection.addAutoShape เพื่อเพิ่มเส้นแนวนอนบนสไลด์เหนือแผนภูมิ ตำแหน่งของเส้นระบุด้วยพิกัดของสไลด์เป็นจุด, ดังนั้นเริ่มจากขอบซ้ายของแผนภูมิและอยู่กึ่งกลางความสูงของแผนภูมิ ความกว้างของเส้นตรงกับความกว้างของแผนภูมิ วิธี getLineFormat ให้เข้าถึงการจัดรูปแบบเส้นเพื่อกำหนดสีแดงทึบ

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import ChartType, FillType, Presentation, SaveFormat, ShapeType
from java.awt import Color

presentation = Presentation()
try:
    slide = presentation.getSlides().get_Item(0)

    chart = slide.getShapes().addChart(ChartType.ClusteredColumn, 100, 100, 500, 400)

    line = slide.getShapes().addAutoShape(ShapeType.Line, chart.getX(), chart.getY() + chart.getHeight() / 2, chart.getWidth(), 0)
    line.getLineFormat().getFillFormat().setFillType(FillType.Solid)
    line.getLineFormat().getFillFormat().getSolidFillColor().setColor(Color.RED)

    presentation.save("AddCustomLines.pptx", SaveFormat.Pptx)
finally:
    presentation.dispose()

คำถามที่พบบ่อย

‘forward’ และ ‘backward’ มีความหมายอย่างไรสำหรับเส้นแนวโน้ม?

เป็นความยาวของเส้นแนวโน้มที่ฉายไปข้างหน้า/ถอยหลัง: สำหรับแผนภูมิกระจาย (XY) — หน่วยแกน; สำหรับแผนภูมิที่ไม่ใช่กระจาย — จำนวนหมวดหมู่ ค่าที่รับได้ต้องเป็นค่าที่ไม่เป็นลบเท่านั้น

เส้นแนวโน้มจะคงอยู่หรือไม่เมื่อส่งออกงานนำเสนอเป็น PDF หรือ SVG หรือเมื่อแปลงสไลด์เป็นรูปภาพ?

ใช่ Aspose.Slides จะแปลงงานนำเสนอเป็น PDF หรือ SVG และเรนเดอร์แผนภูมิเป็นรูปภาพ; เส้นแนวโน้มในฐานะส่วนหนึ่งของแผนภูมิจะถูกเก็บไว้ในกระบวนการเหล่านี้ อีกทั้งยังมีเมธอดสำหรับ export an image of the chart ด้วย