我正在開發一個腳本,它回傳一個包含 4 個方程的最大值的圖。然而,我這樣做的方式,每個方程的最大值點的值顯示在一個不容易閱讀的地方。我怎樣才能把圖例更多地放在右邊或左邊?
代碼:
import math as mt
import numpy as np
import matplotlib.pyplot as plt
v = 20 #(V?o em metros)
h = 6 #("Altura do pilar em metros:")
ht = 8 #("Altura total metros:")
alfa_rad = mt.atan((int(ht)-int(h))/(int(v)/2))
alfa_deg = alfa_rad*180/mt.pi
lasna = ((v/2) ** 2 (ht-h) ** 2) ** 0.5
alfa = (mt.atan((int(ht)-int(h))/(int(v)/2)))*180/((mt.pi))
h1 = np.arange(0, h 1, 1)
ha1 = np.arange(0, lasna, 0.1)
ha2 = np.arange(0, lasna, 0.1)
hp2 = np.arange(0, h 1, 1)
R = lambda x, y, theta: np.array([
[np.cos(theta), np.sin(theta), x],
[-np.sin(theta), np.cos(theta), y],
[0, 0, 1],
])
Vx = np.array([
[1, 0, 0], [0, -1, 0], [0, 0, 1]
])
Vy = np.array([
[-1, 0, 0], [0, 1, 0], [0, 0, 1]
])
vpilar1 = (1000 * h1 ** 2 50)/ 1000
vasna1 = (50 *ha1 ** 2 5) / 1000
vasna2 = (100 * ha2 ** 2 7) / 1000
vpilar2 = (150 * hp2 ** 2 5) / 1000
def draw_line():
fig, ax = plt.subplots()
x_number_list = [0, 0, (v/2), v, v]
y_number_list = [0, h, ht, h, 0]
plt.plot(x_number_list, y_number_list, linewidth=3)
points1 = np.stack([h1, vpilar1 / max(abs(vpilar1)), np.ones_like(h1)])
points1 = np.matmul(R(0, 0, -np.pi/2), points1)
plt.plot(points1[0, :], points1[1, :], label="Vpilar1")
idx = np.argmax(vpilar1)
max_p = np.array([[h1[idx], (vpilar1 / max(abs(vpilar1)))[idx], 1]]).T
max_p_tranformed = np.matmul(R(0, 0, -np.pi/2), max_p)
plt.text(*max_p_tranformed[:-1], str(vpilar1[idx]))
plt.scatter(*max_p_tranformed[:-1], marker="x", color="k")
points2 = np.stack([h1, vpilar2 / max(abs(vpilar2)), np.ones_like(h1)])
points2 = np.matmul(R(v, 0, -np.pi/2), points2)
plt.plot(points2[0, :], points2[1, :], label="Vpilar2")
idx = np.argmax(vpilar2)
max_p = np.array([[h1[idx], (vpilar2 / max(abs(vpilar2)))[idx], 1]]).T
max_p_tranformed = np.matmul(R(v, 0, -np.pi/2), max_p)
plt.text(*max_p_tranformed[:-1], str(vpilar2[idx]))
plt.scatter(*max_p_tranformed[:-1], marker="x", color="k")
points3 = np.stack([ha1, vasna1 / max(abs(vasna1)), np.ones_like(ha1)])
points3 = np.matmul(R(0, h, -alfa_rad), points3)
plt.plot(points3[0, :], points3[1, :], label="Vasna1")
idx = np.argmax(vasna1)
max_p = np.array([[ha1[idx], (vasna1 / max(abs(vasna1)))[idx], 1]]).T
max_p_tranformed = np.matmul(R(0, h, -alfa_rad), max_p)
plt.text(*max_p_tranformed[:-1], str(vasna1[idx]))
plt.scatter(*max_p_tranformed[:-1], marker="x", color="k")
points4 = np.stack([ha1, vasna2 / max(abs(vasna2)), np.ones_like(ha1)])
points4 = np.matmul(np.matmul(R(v, h, alfa_rad), Vy), points4)
plt.plot(points4[0, :], points4[1, :], label="Vasna2")
idx = np.argmax(vasna2)
max_p = np.array([[ha1[idx], (vasna2 / max(abs(vasna2)))[idx], 1]]).T
max_p_tranformed = np.matmul(np.matmul(R(v, h, alfa_rad), Vy), max_p)
plt.scatter(*max_p_tranformed[:-1], marker="x", color="k")
plt.title("Esfor?o de Corte (kN)", fontsize=15)
plt.show()
draw_line()
PS:我是SO中的小白,所以很遺憾我不能展示情節。
uj5u.com熱心網友回復:
plt.text函式中的draw_line()是負責撰寫具有最大值的文本的代碼部分。在您的代碼中,它只有 3 個,認為您洗掉了第 4 個,因為它在另一個之上。文本的位置(x 和 y 坐標)由第一個變數控制。您需要添加一些額外的空格才能將文本移動到您想要的位置。下面是更新后的 4 行代碼。如果您對代碼進行更改,您應該能夠看到文本移動。
plt.text(*max_p_tranformed[:-1][0] 0.1, *max_p_tranformed[:-1][1] 0.2, str(vpilar1[idx]))
……
plt.text(*max_p_tranformed[:-1][0] 0.1, *max_p_tranformed[:-1][1] 0.3, str(vpilar2[idx]))
……
plt.text(*max_p_tranformed[:-1][0]-7.3, *max_p_tranformed[:-1][1] 0.1, str(vasna1[idx]))
……
plt.text(*max_p_tranformed[:-1][0] 0.1, *max_p_tranformed[:-1][1] 0.1, str(vasna2[idx]))
圖表看起來像這樣。更改增量( 0.1、 0.2 等)以查看文本向上/向下或向左/向右移動。
帶有這些調整的輸出圖

轉載請註明出處,本文鏈接:https://www.uj5u.com/net/478260.html
標籤:Python matplotlib
