【问题标题】:matplotlib: change title and colorbar text and tick colorsmatplotlib:更改标题和颜色栏文本以及刻度颜色
【发布时间】:2025-12-06 00:50:01
【问题描述】:

我想知道如何更改颜色栏中刻度的颜色以及如何更改图形中标题和颜色栏的字体颜色。例如,东西显然在 temp.png 中可见,但在 temp2.​​png 中不可见:

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import randn

fig = plt.figure()
data = np.clip(randn(250,250),-1,1)
cax = plt.imshow(data, interpolation='nearest')
plt.title('my random fig')
plt.colorbar()

# works fine
plt.savefig('temp.png')
# title and colorbar ticks and text hidden
plt.savefig('temp2.png', facecolor="black", edgecolor="none")

谢谢

【问题讨论】:

标签: python matplotlib


【解决方案1】:

(更新:此答案中的信息已过时,请在下方滚动查看其他最新且更适合新版本的答案)

这可以通过在 matplotlib 中检查和设置对象处理程序的属性来完成。

我编辑了您的代码并在评论中添加了一些解释:

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import randn

fig = plt.figure()
data = np.clip(randn(250,250),-1,1)
cax = plt.imshow(data, interpolation='nearest')

title_obj = plt.title('my random fig') #get the title property handler
plt.getp(title_obj)                    #print out the properties of title
plt.getp(title_obj, 'text')            #print out the 'text' property for title
plt.setp(title_obj, color='r')         #set the color of title to red

axes_obj = plt.getp(cax,'axes')                 #get the axes' property handler
ytl_obj = plt.getp(axes_obj, 'yticklabels')     #get the properties for 
                                                #  yticklabels
plt.getp(ytl_obj)                               #print out a list of properties
                                                #  for yticklabels
plt.setp(ytl_obj, color="r")                    #set the color of yticks to red

plt.setp(plt.getp(axes_obj, 'xticklabels'), color='r') #xticklabels: same

color_bar = plt.colorbar()                            #this one is a little bit
cbytick_obj = plt.getp(color_bar.ax.axes, 'yticklabels')                #tricky
plt.setp(cbytick_obj, color='r')

plt.savefig('temp.png')
plt.savefig('temp2.png', facecolor="black", edgecolor="none")

【讨论】:

  • 只是对使用子图的人的补充。您可以将颜色分配给单独的颜色条轴对象,如下所示: cb = fig.colorbar(im,ax=ax), cb.ax.tick_params(axis='y',colors='white')
【解决方案2】:

根据之前的答案,我添加了两行来设置颜色条的框颜色和颜色条的刻度颜色:

import matplotlib.pyplot as plt
import numpy as np
from numpy.random import randn

fig = plt.figure()
data = np.clip(randn(250,250),-1,1)
cax = plt.imshow(data, interpolation='nearest')

title_obj = plt.title('my random fig') #get the title property handler
plt.setp(title_obj, color='w')         #set the color of title to white

axes_obj = plt.getp(cax,'axes')                        #get the axes' property handler
plt.setp(plt.getp(axes_obj, 'yticklabels'), color='w') #set yticklabels color
plt.setp(plt.getp(axes_obj, 'xticklabels'), color='w') #set xticklabels color

color_bar = plt.colorbar()                            
plt.setp(plt.getp(color_bar.ax.axes, 'yticklabels'), color='w') # set colorbar  
                                                                # yticklabels color
##### two new lines ####
color_bar.outline.set_color('w')                   #set colorbar box color
color_bar.ax.yaxis.set_tick_params(color='w')      #set colorbar ticks color 
##### two new lines ####

plt.setp(cbytick_obj, color='r')
plt.savefig('temp.png')
plt.savefig('temp3.png', facecolor="black", edgecolor="none")

【讨论】:

    【解决方案3】:

    以前的答案没有给出我想要的。 我就是这样做的:

    import matplotlib.pyplot as plt
    import numpy as np
    from numpy.random import randn
    data = np.clip(randn(250,250),-1,1)
    data = np.ma.masked_where(data > 0.5, data)
    
    
    fig, ax1 = plt.subplots(1,1)
    
    im = ax1.imshow(data, interpolation='nearest')
    cb = plt.colorbar(im)
    
    fg_color = 'white'
    bg_color = 'black'
    
    # IMSHOW    
    # set title plus title color
    ax1.set_title('ax1 title', color=fg_color)
    
    # set figure facecolor
    ax1.patch.set_facecolor(bg_color)
    
    # set tick and ticklabel color
    im.axes.tick_params(color=fg_color, labelcolor=fg_color)
    
    # set imshow outline
    for spine in im.axes.spines.values():
        spine.set_edgecolor(fg_color)    
    
    # COLORBAR
    # set colorbar label plus label color
    cb.set_label('colorbar label', color=fg_color)
    
    # set colorbar tick color
    cb.ax.yaxis.set_tick_params(color=fg_color)
    
    # set colorbar edgecolor 
    cb.outline.set_edgecolor(fg_color)
    
    # set colorbar ticklabels
    plt.setp(plt.getp(cb.ax.axes, 'yticklabels'), color=fg_color)
    
    fig.patch.set_facecolor(bg_color)    
    plt.tight_layout()
    plt.show()
    #plt.savefig('save/to/pic.png', dpi=200, facecolor=bg_color)
    

    【讨论】:

    • 神奇的东西@Mattijn
    • cb.ax.yaxis.set_tick_params(color=fg_color, labelcolor=fg_color) 同时设置刻度和刻度标签颜色。
    【解决方案4】:

    虽然其他答案肯定是正确的,但使用样式或特定 rcParams 或使用 tick_params 函数似乎更容易解决这个问题

    样式

    Matplotlib 提供dark_background 样式。您可以使用它,例如通过plt.style.use("dark_background"):

    import matplotlib.pyplot as plt
    import numpy as np
    
    plt.style.use("dark_background")
    
    fig = plt.figure()
    data = np.clip(np.random.randn(150,150),-1,1)
    plt.imshow(data)
    plt.title('my random fig')
    plt.colorbar()  
    
    plt.savefig('temp2.png', facecolor="black", edgecolor="none")
    plt.show()
    

    或者,如果您需要创建具有和不具有黑色背景的相同图形,可以在上下文中使用样式。

    import matplotlib.pyplot as plt
    import numpy as np
    
    def create_plot():
        fig = plt.figure()
        data = np.clip(np.random.randn(150,150),-1,1)
        plt.imshow(data)
        plt.title('my random fig')
        plt.colorbar()
        return fig
    
    # create white background plot
    create_plot()
    plt.savefig('white_bg.png')
    
    with plt.style.context("dark_background"):
        create_plot()
        plt.savefig('dark_bg.png', facecolor="black", edgecolor="none")
    

    Customizing matplotlib 教程中了解更多信息。

    具体的 rcParams

    您可以单独设置所需的rcParams,以在脚本中所需的位置构成样式。

    例如使任何文本变为蓝色并将 yticks 变为红色:

    params = {"text.color" : "blue",
              "xtick.color" : "crimson",
              "ytick.color" : "crimson"}
    plt.rcParams.update(params)
    

    这也会自动为刻度线着色。

    自定义刻度和标签

    您也可以单独自定义图中的对象。对于刻度和刻度标签,有一个 tick_params 方法。例如。只使颜色条的刻度变为红色,

    cbar = plt.colorbar()
    cbar.ax.tick_params(color="red", width=5, length=10)
    

    【讨论】:

      最近更新 更多