matplotlib散点图脚本中的错误

时间:2016-12-08 23:27:31

标签: python python-3.x matplotlib

我使用matplotlib遇到了一个非常奇怪的问题(也许是一个bug?)。长话短说,如果我运行包含4个数据点的案例的脚本,颜色方案完全搞砸了(我称之为灰度,但这些点在图例中以默认蓝色结束,而在图中完全不同) 。但是,任何其他数量的点似乎都按照灰度显示。在下面的最小情况下,如果行:

plt.scatter([1,2,3,4,5], [1,2,3,4,5], s= 40, c=colors[j], linewidth='0.5', marker=markers[j]) 

被更改为x,y点为[1,2,3,4],此问题出现,但如果保持不变,则数据以灰度显示正确。有什么建议吗?

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

if __name__ == "__main__":

    savefile = 'P0p5_TINL.png'
    title = 'Normalized Extinction Residence Time\n Inlet Temperature = 300 K'
    xlabel = 'Inlet Temperature (K)'
    phi_list = [0.5, 1.0, 2.0]
    numvals = len(phi_list)
    labels = ['$\phi$ = ', ' ']
    markers = ['o', 'v', 's', '+', 'p', 'D', '*']

    fig1 = plt.figure()    
    start = 0.0
    stop = 1.0
    col_list = np.linspace(start, stop, numvals)
    colors = [plt.cm.gray(x) for x in col_list]
    legend = []
    leg_list = []
    for j in range(0, len(phi_list)):
        plt.scatter([1,2,3,4,5], [1,2,3,4,5], s= 40, c=colors[j], linewidth='0.5', marker=markers[j])
    for i in range(0, numvals):
        temp = [labels[0], str(phi_list[i]), labels[1]]
        leg_list = "".join(temp)
        legend.append(leg_list)

    # Axis definitions
    ax = fig1.add_subplot(1,1,1)
    ax.set_xlabel(xlabel, fontsize='14')
    ax.set_ylabel('Normalized Extinction Residence Time', fontsize='14')
    ax.set_xscale("linear")
    ax.set_yscale("linear")

    plt.legend(legend, bbox_to_anchor=(0.3, 0.95), fontsize='14')
    plt.title(title)    
    plt.show()
    fig1.savefig(savefile, bbox_inches='tight')

1 个答案:

答案 0 :(得分:1)

阅读the documentation总是有帮助的,它说的是

  

请注意,c不应该是单个数字RGB或RGBA序列,因为它与要进行颜色映射的值数组无法区分

当提供4个点并提供4个浮点数的元组作为c参数时,pyplot会认为每个浮点数代表相应点的颜色并使用默认的颜色映射绘制它。

由于问题仅发生在恰好有四个点,并且由于可以将颜色指定为仅具有3个值的RGB序列,因此解决方法是简单地指定3元组,省略透明度。

plt.scatter([1,2,3,4], [1,2,3,4], s= 40, c=colors[j][:-1], marker=markers[j])

如果需要透明度,可以使用alpha关键字进行设置。

<小时/> 编辑: 更准确地说明:该问题与提供的列表的长度无关,但事实上列表可以被解释为要进行颜色映射的值数组。 要达到这个目的,需要满足三个条件:

  1. 提供的列表长度为3或4
  2. 提供的列表是浮点值列表。
  3. 提供的列表长度与绘制的点数相同。
  4. 一旦您违反上述任何条件,一切都将按预期工作。以上打破了条件3.但当然你也可以通过指定单一颜色来打破条件1

    # use a predefined array like in the case of the markes
    cols = ["#000000","#555555", "#aaaaaa","#ffffff"]
    plt.scatter([1,2,3,4], [1,2,3,4], s= 40, c=cols[j], marker=markers[j])
    
    # or in dependence on the original col_list:
    plt.scatter([1,2,3,4], [1,2,3,4], s= 40, 
        c="#"+6*str(int(col_list[j]*9.9)), marker=markers[j])
    

    最后一个人也可以通过指定一个相同长度的列表来破坏条件2,但是颜色定义不是浮点值:

    plt.scatter([1,2,3,4], [1,2,3,4], s= 40, c=[colors[j]]*4, marker=markers[j])