我使用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')
答案 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
关键字进行设置。
<小时/> 编辑: 更准确地说明:该问题与提供的列表的长度无关,但事实上列表可以被解释为要进行颜色映射的值数组。 要达到这个目的,需要满足三个条件:
一旦您违反上述任何条件,一切都将按预期工作。以上打破了条件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])