plt.figure中设置及调整xlabel、ylabel位置、字体大小和标签方向,以及X轴刻度标签位置、大小

    2025-10-25 23:20:41

    我们拿一个最简单的plt绘图案例举例说明:

    (存贴自用)

    import matplotlib.pyplot as plt

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    plt.figure()

    plt.plot(x,y)#对于x从零开始时,plt.plot(y)效果是一样的

    plt.show()

    1、xlabel、ylabel的调整

    label的创建

    对于上面那幅极致简单的图片来说,缺少必要的X轴Y轴说明,我们可以使用label参数设置其x、y轴的标签:

    import matplotlib.pyplot as plt

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    plt.figure()

    plt.xlabel('Time')

    plt.ylabel('Cost')

    plt.plot(x,y)

    plt.show()

    label的大小

    这下似乎看起来可以了,已经可以让别人知道X轴Y轴表示的啥意思了,但是X轴Y轴标签太小或太大怎么办?plt提供了参数:

    import matplotlib.pyplot as plt

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    plt.figure()

    plt.xlabel('Time',fontsize=20)#直接调整fontsize中的值就可以了

    plt.ylabel('Cost',fontsize=20)

    plt.plot(x,y)

    plt.show()

    像我这样将fontszie设置为20,X轴标签似乎有点太极限贴近下边界了,我们可以适当调整figure大小:

    import matplotlib.pyplot as plt

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    plt.figure(figsize=(15,8))#figsize控制figure大小

    plt.xlabel('Time',fontsize=20)

    plt.ylabel('Cost',fontsize=20)

    plt.plot(x,y)

    plt.show()

    xylabel的位置与方向的调整

    import matplotlib.pyplot as plt

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=45, ha='right', va='top')

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom')

    plt.plot(x,y)

    plt.show()

    rotation表示顺时针旋转的角度,记得旋转中心是字符串的形状中心。

    你就把label看做一条向量,中心点的位置就是旋转中心,指向label末尾字符,X轴初始默认为0,Y轴默认为90,想要什么角度转就可以了。ha的参数选择有:‘center’, ‘right’, ‘left’。

    表示水平方向的位置,这个水平方向指的是平行坐标轴的方向,即Y轴的ha表示标签在平行于y轴方向上在左、右或中间哪个位置,坐标轴原点为左。va的参数选择有’top’, ‘bottom’, ‘center’, ‘baseline’,‘center_baseline’。

    表示垂直方向的位置,同样的这里的垂直方向指的也是垂直于坐标轴的方向,靠近坐标轴称top,远离坐标轴接近figure边界称bottom。

    如果你想精确一点坐标轴标签距离坐标轴的位置,你可以借助pad参数调整:

    import matplotlib.pyplot as plt

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=45, ha='right', va='top')

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom',labelpad=50)

    plt.plot(x,y)

    plt.show()

    labelpad表示标签距离坐标轴的距离,越远离越大

    2、X轴刻度标签的调整

    一般来说,我们只需要使用plt.plot(x,y)就能把两个轴的刻度部署到对应轴上了,但是我们可能会有一些特殊的需求或者调整。

    拿个例子说明一下X轴刻度标签的调整,让X轴显示具体时间:

    import matplotlib.pyplot as plt

    import datetime

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    dtime=[]

    for i in range(len(y)):

    time_format = datetime.datetime.fromtimestamp(1667663400+i*86400)

    dtime.append(str(time_format)[:10])

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=0, ha='right', va='top',labelpad=15)

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom',labelpad=50)

    plt.plot(dtime,y)

    plt.show()

    这面临一个问题,如果我的点太密,X轴显示的刻度标签就会堆叠起来,就需要进行X轴刻度标签的调整:

    第一种方法

    让刻度值均匀显示:

    import matplotlib.pyplot as plt

    import datetime

    from matplotlib.ticker import MultipleLocator

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    dtime=[]

    for i in range(len(y)):

    time_format = datetime.datetime.fromtimestamp(1667663400+i*86400)

    dtime.append(str(time_format)[:])

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=0, ha='right', va='top',labelpad=15)

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom',labelpad=50)

    x_major_locator = MultipleLocator(len(dtime) // 5)#此处最后的数字“5”为欲显示刻度数量,会均匀地显示5个刻度

    ax = plt.gca()

    ax.xaxis.set_major_locator(x_major_locator)

    # xindex=[2,6,8]

    # plt.xticks(xindex, [dtime[m] for m in xindex])

    plt.plot(dtime,y)#这里X轴对应的是dtime

    plt.show()

    第二种方法

    可以自己设置要显示的刻度

    import matplotlib.pyplot as plt

    import datetime

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    dtime=[]

    for i in range(len(y)):

    time_format = datetime.datetime.fromtimestamp(1667663400+i*86400)

    dtime.append(str(time_format)[:])

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=0, ha='right', va='top',labelpad=15)

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom',labelpad=50)

    xindex=[0,2,4,6,8]

    plt.xticks(xindex, [dtime[m] for m in xindex])#自由显示刻度,xindex存一下要显示的刻度从0开始的下标即可

    plt.plot(range(len(dtime)),y)#这里X轴用位置替代

    plt.show()

    坐标轴及折线线条的粗细调整

    关于坐标轴的调整

    在这里要搞清楚一件事,X轴与figure下边轴、Y轴与figure左边轴他不是一码事,举例来说我们要加深X轴Y轴的粗细:

    import matplotlib.pyplot as plt

    import datetime

    from matplotlib.ticker import MultipleLocator

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    dtime=[]

    for i in range(len(y)):

    time_format = datetime.datetime.fromtimestamp(1667663400+i*86400)

    dtime.append(str(time_format)[:])

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=0, ha='right', va='top',labelpad=15)

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom',labelpad=50)

    x_major_locator = MultipleLocator(len(dtime) // 5)

    ax = plt.gca()

    ax.xaxis.set_major_locator(x_major_locator)

    # xindex=[2,6,8]

    # plt.xticks(xindex, [dtime[m] for m in xindex])

    plt.axhline(linewidth=5, color='black') # X 轴线条粗细

    plt.axvline(linewidth=5, color='black') # Y 轴线条粗细

    plt.plot(dtime,y)

    plt.show()

    很容易明白,此时直接用axhline捕获到的是0水平轴,不是我们理解上的X轴,解决办法有两条:

    一是顺便调整原点位置,让0,0或者图像起始点就是原点:

    import matplotlib.pyplot as plt

    import datetime

    from matplotlib.ticker import MultipleLocator

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    dtime=[]

    for i in range(len(y)):

    time_format = datetime.datetime.fromtimestamp(1667663400+i*86400)

    dtime.append(str(time_format)[:])

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=0, ha='right', va='top',labelpad=15)

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom',labelpad=50)

    x_major_locator = MultipleLocator(len(dtime) // 5)

    ax = plt.gca()

    ax.xaxis.set_major_locator(x_major_locator)

    # xindex=[2,6,8]

    # plt.xticks(xindex, [dtime[m] for m in xindex])

    plt.xlim(0,len(dtime))

    plt.ylim(0,max(y))

    plt.axhline(linewidth=5, color='black') # X 轴线条粗细

    plt.axvline(linewidth=5, color='black') # Y 轴线条粗细

    plt.plot(dtime,y)

    plt.show()

    二是不动原点,直接加深figure边轴

    import matplotlib.pyplot as plt

    import datetime

    from matplotlib.ticker import MultipleLocator

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    dtime=[]

    for i in range(len(y)):

    time_format = datetime.datetime.fromtimestamp(1667663400+i*86400)

    dtime.append(str(time_format)[:])

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=0, ha='right', va='top',labelpad=15)

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom',labelpad=50)

    x_major_locator = MultipleLocator(len(dtime) // 5)

    ax = plt.gca()

    ax.xaxis.set_major_locator(x_major_locator)

    # xindex=[2,6,8]

    # plt.xticks(xindex, [dtime[m] for m in xindex])

    # plt.xlim(0,len(dtime))

    # plt.ylim(0,max(y))

    # plt.axhline(linewidth=5, color='black') # X 轴线条粗细

    # plt.axvline(linewidth=5, color='black') # Y 轴线条粗细

    left_spine = plt.gca().spines['left']# 获取左边轴对象

    left_spine.set_linewidth(5)# 设置线条粗细

    left_spine = plt.gca().spines['bottom']

    left_spine.set_linewidth(5)

    plt.plot(dtime,y)

    plt.show()

    从这里也可以得到把边轴隐藏掉的一个方法,直接设置其线条粗细为0就好:

    left_spine = plt.gca().spines['top']

    left_spine.set_linewidth(0)

    left_spine = plt.gca().spines['right']

    left_spine.set_linewidth(0)

    折线线条的粗细调整

    plot的时候用linewidth参数调整一下就好

    plt.plot(dtime,y,linewidth=5)

    总代码

    import matplotlib.pyplot as plt

    import datetime

    from matplotlib.ticker import MultipleLocator

    y=[1,6,5,2,7,1,4,3,6,2]

    x=[m for m in range(len(y))]

    dtime=[]

    for i in range(len(y)):

    time_format = datetime.datetime.fromtimestamp(1667663400+i*86400)

    dtime.append(str(time_format)[:])

    plt.figure(figsize=(15,8))

    plt.xlabel('Time',fontsize=20, rotation=0, ha='right', va='top',labelpad=15)

    plt.ylabel('Cost',fontsize=20, rotation=90, ha='center', va='bottom',labelpad=50)

    x_major_locator = MultipleLocator(len(dtime) // 5)

    ax = plt.gca()

    ax.xaxis.set_major_locator(x_major_locator)

    # xindex=[2,6,8]

    # plt.xticks(xindex, [dtime[m] for m in xindex])

    # plt.xlim(0,len(dtime))

    # plt.ylim(0,max(y))

    # plt.axhline(linewidth=5, color='black') # X 轴线条粗细

    # plt.axvline(linewidth=5, color='black') # Y 轴线条粗细

    left_spine = plt.gca().spines['left']# 获取左边轴对象

    left_spine.set_linewidth(5)# 设置线条粗细

    left_spine = plt.gca().spines['bottom']

    left_spine.set_linewidth(5)

    left_spine = plt.gca().spines['top']

    left_spine.set_linewidth(0)

    left_spine = plt.gca().spines['right']

    left_spine.set_linewidth(0)

    plt.plot(dtime,y,linewidth=5)

    # plt.show()

    plt.savefig('E:/CSDN/案例.png')

    注意一个点,figsize的大小如果超出show的显示大小限制,会看不出来实际大小,只会铺满全屏,所以用savefig存一下才能看出你实际调整的效果,用dpi参数可以调整分辨率,不过太大了也不好,得放大了才看得清楚。

    待补充。。。