【问题标题】:How to add common Tittle, label and legend in Matplotlib.pyplot?如何在 Matplotlib.pyplot 中添加常用的标题、标签和图例?
【发布时间】:2022-01-21 08:57:13
【问题描述】:

我的以下代码无法添加通用标题、通用图例以及通用 x 和 y 标签。当我添加标题时,for loop 之间的图例可以工作,但它不适用于整个数字? 我想在这个图中添加一个共同的标题、共同的图例和共享的 x 和 y 标签。最好的方法是什么?

我的代码

#position vs Time 
h = 0.05
nrow, ncol, count = 2,4,1


plt.figure(figsize=(20,10))
plt.title("Common Title") #does not working
with plt.style.context('ggplot'):
    for inv in range(8):
        plt.subplot(nrow, ncol, count)
        x = [1]
        v = [0]

        rk4_x = [1] #position
        rk4_v = [0] #velocity

        t = np.arange(0, 30, 0.1)
        for i in range(len(t)-1):
            k1 = h*v[i]
            l1 = h*-(x[i])
            k2 = h*(v[i]+l1)
            l2 = h*-(x[i]+k1)
            x_value = x[i]+0.5*(k1+k2)
            x.append(x_value)
            v_value = v[i]+0.5*(l1+l2)
            v.append(v_value)

            k1 = h*rk4_v[i]
            l1 = h*-(rk4_x[i])
            k2 = h*(rk4_v[i]+0.5*l1)
            l2 = h*-(rk4_x[i]+0.5*k1)
            k3 = h*(rk4_v[i]+0.5*l2)
            l3 = h*-(rk4_x[i]+0.5*k2)
            k4 = h*(rk4_v[i]+l3)
            l4 = h*-(rk4_x[i]+k3)
            x_value = rk4_x[i]+(1/6)*(k1+2*k2+2*k3+k4)
            rk4_x.append(x_value)
            v_value = rk4_v[i]+(1/6)*(l1+2*l2+2*l3+l4)
            rk4_v.append(v_value)

            

        # with plt.style.context('ggplot'):
        # plt.figure()
        plt.plot(t, x,'r', label= "Position vs Time RK2")
        plt.plot(t, rk4_x, 'k--',  label = "Position vs Time RK4")

        plt.ylim(-1.5, 1.5)
        h = round(h,3)
        plt.title("h="+str(h), fontsize= '11')
        plt.grid('on')
        plt.tick_params(labelcolor='none', which='both', top=False, bottom=False, left=False, right=False)
        plt.xlabel('Time')
        plt.ylabel('Position')
        plt.legend()


        h = h + 0.05
        count = count+1

【问题讨论】:

  • 尝试使用plt.suptitle('common title'),见matplotlib.pyplot.suptitle
  • 成功了。你能帮忙解决plt.subxlabel('common x label') 不工作的问题吗?显示 plt 没有任何名为 this 的模块。 @BG 公园
  • 两者都使用字幕,更改y= 参数。见matplotlib.org/stable/api/_as_gen/…
  • @TahmidulAzomSany 请看下面的答案。 :)

标签: python matplotlib plot title subplot


【解决方案1】:

使用带有 fig、axs 的子图。见the document on matplotlib.pyplot.subplots

你应该使用 Numpy 数组 而不是 python 列表来加快数值计算。 (不是这个例子,但一般来说)。

此外,如果计算量增加,似乎有必要使公式简单。赞x[i+1] = (1 - 0.5 * h**2) * x[i]+ h * v[i]

import numpy as np
import matplotlib.pyplot as plt
import matplotlib

matplotlib.use('Agg')
plt.style.use('ggplot')

def get_x_v(h, t):
    x = np.ones_like(t)
    v = np.zeros_like(t)
    rk4_x = np.ones_like(t)
    rk4_v = np.zeros_like(t)

    for i, _ in enumerate(t[:-1]):
        k1 = h * (v[i])
        l1 = h * (x[i]) * -1
        k2 = h * (v[i] + l1)
        l2 = h * (x[i] + k1) * -1

        x[i+1] = x[i] + 0.5 * (k1 + k2)
        v[i+1] = v[i] + 0.5 * (l1 + l2)

        rk1 = h * (rk4_v[i])
        rl1 = h * (rk4_x[i]) * -1
        rk2 = h * (rk4_v[i] + 0.5 * rl1)
        rl2 = h * (rk4_x[i] + 0.5 * rk1) * -1
        rk3 = h * (rk4_v[i] + 0.5 * rl2)
        rl3 = h * (rk4_x[i] + 0.5 * rk2) * -1
        rk4 = h * (rk4_v[i] + rl3)
        rl4 = h * (rk4_x[i] + rk3) * -1

        rk4_x[i+1] = rk4_x[i]+(1/6)*(rk1+2*rk2+2*rk3+rk4)
        rk4_v[i+1] = rk4_v[i]+(1/6)*(rl1+2*rl2+2*rl3+rl4)

    return x, v, rk4_x, rk4_v

h = 0.05
ncol, nrow = 4, 2

fig, axs = plt.subplots(nrows=nrow, ncols=ncol, figsize=(20, 10))
fig.suptitle('Common Title', y=0.94, fontsize=20)
fig.supxlabel('Common X Label', y=0.05, fontsize=14)

t = np.arange(0, 30, 0.1)
for ax in axs.flat:
    x, v, rk4_x, rk_v = get_x_v(h, t)
    ax.plot(t, x, 'r', label="Position vs Time RK2")
    ax.plot(t, rk4_x, 'k--',  label="Position vs Time RK4")

    ax.set_ylim(-1.5, 1.5)
    ax.set_title('h={0}'.format(str(round(h,3))), fontsize='11')
    ax.grid('on')
    ax.tick_params(labelcolor='none', which='both',
                    top=False, bottom=False, left=False, right=False)
    ax.set_xlabel('Time')
    ax.set_ylabel('Position')
    ax.legend(loc=1)
    ax.set_facecolor('gray')
    h += 0.05

plt.savefig('test.png')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    相关资源
    最近更新 更多