การวางคำอธิบายภาพ ( bbox_to_anchor
)
ตำนานอยู่ในตำแหน่งภายในกรอบของแกนโดยใช้อาร์กิวเมนต์loc
เช่นวางตำนานในมุมขวาบนของกล่อง bounding ซึ่งโดยค่าเริ่มต้น extents จากถึงในพิกัดแกน (หรือในสัญกรณ์กล่อง bounding )plt.legend
loc="upper right"
(0,0)
(1,1)
(x0,y0, width, height)=(0,0,1,1)
หากต้องการวางคำอธิบายแผนภูมิไว้นอกกล่องขอบเขตแกนจะมีการระบุ(x0,y0)
พิกัดของแกนของมุมล่างซ้ายของตำนาน
plt.legend(loc=(1.04,0))
อย่างไรก็ตามวิธีการที่หลากหลายมากขึ้นคือการระบุช่องว่างที่ตำนานควรจะวางด้วยตนเองโดยใช้bbox_to_anchor
อาร์กิวเมนต์ หนึ่งสามารถ จำกัด ตัวเองเพื่อจัดหาเพียง(x0,y0)
ส่วนหนึ่งของ bbox สิ่งนี้จะสร้าง zero span box ซึ่งคำอธิบายจะขยายไปในทิศทางที่กำหนดโดยloc
อาร์กิวเมนต์ เช่น
plt.legend (bbox_to_anchor = (1.04,1), loc = "ซ้ายบน")
วางคำอธิบายแผนภูมิไว้นอกแกนดังนั้นมุมซ้ายบนของคำอธิบายแผนภูมิจะอยู่ในตำแหน่ง(1.04,1)
ในพิกัดแกน
ตัวอย่างเพิ่มเติมจะได้รับด้านล่างซึ่งมีอิทธิพลซึ่งกันและกันระหว่างการขัดแย้งที่แตกต่างกันเช่นmode
และncols
จะแสดง
l1 = plt.legend(bbox_to_anchor=(1.04,1), borderaxespad=0)
l2 = plt.legend(bbox_to_anchor=(1.04,0), loc="lower left", borderaxespad=0)
l3 = plt.legend(bbox_to_anchor=(1.04,0.5), loc="center left", borderaxespad=0)
l4 = plt.legend(bbox_to_anchor=(0,1.02,1,0.2), loc="lower left",
mode="expand", borderaxespad=0, ncol=3)
l5 = plt.legend(bbox_to_anchor=(1,0), loc="lower right",
bbox_transform=fig.transFigure, ncol=3)
l6 = plt.legend(bbox_to_anchor=(0.4,0.8), loc="upper right")
รายละเอียดเกี่ยวกับวิธีตีความอาร์กิวเมนต์ 4-tuple ให้bbox_to_anchor
เป็นในl4
สามารถพบได้ในคำถามนี้ การmode="expand"
ขยายตำนานในแนวนอนภายในกล่องขอบเขตที่กำหนดโดย 4-tuple สำหรับตำนานที่ขยายในแนวตั้งให้ดูคำถามนี้นี้
บางครั้งมันอาจมีประโยชน์ในการระบุกล่องขอบเขตในพิกัดรูปแทนพิกัดแกน สิ่งนี้แสดงในตัวอย่างl5
จากด้านบนซึ่งbbox_transform
มีการใช้อาร์กิวเมนต์เพื่อวางคำอธิบายในมุมซ้ายล่างของรูปภาพ
postprocessing
การวางตำนานไว้นอกแกนมักจะนำไปสู่สถานการณ์ที่ไม่พึงประสงค์ว่าอยู่นอกกรอบรูปทั้งหมดหรือบางส่วน
วิธีแก้ไขปัญหานี้คือ:
ปรับค่าพารามิเตอร์แผน
หนึ่งสามารถปรับค่าพารามิเตอร์แผนดังกล่าวว่าแกนใช้พื้นที่น้อยภายในรูป (และจึงออกจากพื้นที่มากขึ้นเพื่อตำนาน) plt.subplots_adjust
โดยใช้ เช่น
plt.subplots_adjust(right=0.7)
ออกจากพื้นที่ 30% ทางด้านขวาของรูปซึ่งสามารถวางตำนานได้
การใช้เลย์เอาต์แบบplt.tight_layout
รัดกุมช่วยให้สามารถปรับพารามิเตอร์แผนย่อยโดยอัตโนมัติเพื่อให้องค์ประกอบต่างๆในรูปอยู่แนบชิดกับขอบรูป น่าเสียดายที่ตำนานไม่ได้ถูกนำมาพิจารณาในระบบอัตโนมัตินี้ แต่เราสามารถจัดหากล่องสี่เหลี่ยมที่พื้นที่ย่อยทั้งหมด (รวมถึงฉลาก) จะพอดี
plt.tight_layout(rect=[0,0,0.75,1])
การบันทึกรูปภาพด้วยbbox_inches = "tight"
อาร์กิวเมนต์bbox_inches = "tight"
ที่plt.savefig
สามารถใช้ในการบันทึกรูปแบบที่ศิลปินทั้งหมดบนผืนผ้าใบ (รวมถึงคำอธิบายภาพ) จะพอดีกับพื้นที่ที่บันทึกไว้ หากจำเป็นขนาดของรูปจะถูกปรับโดยอัตโนมัติ
plt.savefig("output.png", bbox_inches="tight")
- การปรับพารามิเตอร์ย่อย
โดยอัตโนมัติวิธีการปรับตำแหน่งย่อยโดยอัตโนมัติเพื่อให้คำอธิบายแผนภูมิอยู่ในผืนผ้าใบโดยไม่ต้องเปลี่ยนขนาดของตัวเลขในคำตอบนี้:การสร้างรูปที่มีขนาดที่แน่นอนและไม่มีการขยาย (และตำนานนอกแกน)
การเปรียบเทียบระหว่างกรณีที่กล่าวถึงข้างต้น:
ทางเลือก
คำอธิบายภาพ
หนึ่งอาจใช้คำอธิบายประกอบกับรูปแทนแกน, matplotlib.figure.Figure.legend
. สิ่งนี้ได้กลายเป็นประโยชน์อย่างยิ่งสำหรับเวอร์ชัน matplotlib> = 2.1 โดยไม่จำเป็นต้องมีอาร์กิวเมนต์พิเศษ
fig.legend(loc=7)
เพื่อสร้างตำนานสำหรับศิลปินทุกคนในแกนที่แตกต่างกันของรูป ตำนานถูกวางโดยใช้การloc
โต้แย้งคล้ายกับที่วางไว้ในแกน แต่ในการอ้างอิงถึงทั้งร่าง - ดังนั้นมันจะอยู่นอกแกนค่อนข้างอัตโนมัติ สิ่งที่เหลืออยู่คือการปรับเปลี่ยนแผนการย่อยโดยที่ไม่มีการซ้อนทับกันระหว่างตำนานและแกน ตรงนี้จุด"ปรับพารามิเตอร์ย่อย" จากด้านบนจะเป็นประโยชน์ ตัวอย่าง:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,2*np.pi)
colors=["#7aa0c4","#ca82e1" ,"#8bcd50","#e18882"]
fig, axes = plt.subplots(ncols=2)
for i in range(4):
axes[i//2].plot(x,np.sin(x+i), color=colors[i],label="y=sin(x+{})".format(i))
fig.legend(loc=7)
fig.tight_layout()
fig.subplots_adjust(right=0.75)
plt.show()
คำอธิบายแผนภูมิภายในแกนย่อยแบบแยกย่อย
ทางเลือกในการใช้งานbbox_to_anchor
คือการวางคำอธิบายแผนภูมิลงในแกนย่อยแบบแยกย่อย ( lax
) เนื่องจากพล็อตย่อยตำนานควรเล็กกว่าพล็อตเราอาจใช้gridspec_kw={"width_ratios":[4,1]}
ในการสร้างแกน เราสามารถซ่อนแกนlax.axis("off")
แต่ยังคงนำเป็นตำนานใน. จับตำนานและป้ายชื่อจะต้องได้รับจากพล็อตจริงผ่านทางh,l = ax.get_legend_handles_labels()
และจากนั้นจะจ่ายให้กับตำนานในแผน,lax
lax.legend(h,l)
ตัวอย่างที่สมบูรณ์อยู่ด้านล่าง
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = 6,2
fig, (ax,lax) = plt.subplots(ncols=2, gridspec_kw={"width_ratios":[4,1]})
ax.plot(x,y, label="y=sin(x)")
....
h,l = ax.get_legend_handles_labels()
lax.legend(h,l, borderaxespad=0)
lax.axis("off")
plt.tight_layout()
plt.show()
สิ่งนี้สร้างพล็อตที่มีรูปร่างคล้ายกับพล็อตจากด้านบน
นอกจากนี้เรายังสามารถใช้ขวานแรกเพื่อวางตำนาน แต่ใช้bbox_transform
ขวานตำนาน
ax.legend(bbox_to_anchor=(0,0,1,1), bbox_transform=lax.transAxes)
lax.axis("off")
ในวิธีการนี้เราไม่จำเป็นต้องได้รับการจัดการตำนานภายนอก แต่เราจำเป็นต้องระบุ bbox_to_anchor
อาร์กิวเมนต์
อ่านเพิ่มเติมและบันทึก:
- พิจารณาคู่มือคำอธิบายของ matplotlib ด้วยตัวอย่างของสิ่งอื่น ๆ ที่คุณต้องการทำกับตำนาน
- ตัวอย่างโค้ดสำหรับการวางตำนานสำหรับแผนภูมิวงกลมอาจพบได้โดยตรงในคำตอบของคำถามนี้: Python - Legend ซ้อนทับกับแผนภูมิวงกลม
loc
อาร์กิวเมนต์สามารถใช้ตัวเลขแทนสตริงซึ่งโทรสั้น แต่พวกเขาไม่ได้แมปกับแต่ละอื่น ๆ มากสังหรณ์ใจ นี่คือการทำแผนที่สำหรับการอ้างอิง: