【问题标题】:small scatter plot markers in matplotlib are always blackmatplotlib 中的小散点图标记始终为黑色
【发布时间】:2011-09-24 02:22:17
【问题描述】:

我正在尝试使用 matplotlib 制作带有非常小的灰点的散点图。由于点密度,点需要很小。问题是 scatter() 函数的标记似乎既有线条又有填充。当标记很小时,只有线条可见,而不是填充,并且线条的颜色不正确(总是黑色)。

我可以使用 gnuplot 得到我想要的:用点 pt 0 lc rgb 'gray' 绘制“节点”

如何使用 matplotlib scatterplot() 制作非常小的灰点?

【问题讨论】:

    标签: matplotlib


    【解决方案1】:
    scatter([1,2,3], [2,4,5], s=1, facecolor='0.5', lw = 0)
    

    这会将标记大小设置为 1 (s=1),将面色设置为灰色 (facecolor='0.5'),将线宽设置为 0 (lw=0)。

    【讨论】:

    • 这可行,但由于其他答案提到的原因,将edgecolor 设置为'' 更为通用。
    • 实际上,在后来的 Matplotlib 版本中(与 2011 年提出问题时流行的版本相反),您可以使用关键字 'color' 同时设置 edgecolor 和 facecolor。但是,此功能没有记录,建议用于折旧,并且与“绘图”的行为冲突,其中“颜色”只会设置线条颜色和填充颜色,而不是边缘颜色。
    【解决方案2】:

    如果标记没有面(无法填充,例如'+''x'),则必须设置edgecolor 而不是c,并且lw 不应为0

    scatter([1,2,3], [2,4,5], marker='+', edgecolor='r')
    

    以下将不起作用

    scatter([1,2,3], [2,4,5], s=1,  marker='+', facecolor='0.5', lw = 0)
    

    因为边/线不会显示,所以什么都不会显示。

    【讨论】:

    • 为边缘着色是比不显示更好的解决方案。很难找到,因为 matplotlib 文档提到了不正确的“markeredgecolor”而不是正确的“edgecolor”
    【解决方案3】:

    对您的问题最简单的答案是:使用color 参数而不是c 参数来设置整个标记的颜色。

    比较结果很容易看出差异:

    from matplotlib import pyplot as plt
    
    plt.scatter([1,2,3], [3,1,2], c='0.8')  # marker not all gray
    
    plt.scatter([1,2,3], [3,1,2], color='0.8')  # marker all gray
    

    详情: 对于您只想使整个标记为相同的灰色阴影的简单用例,您真的不必担心诸如面部颜色与边缘颜色之类的事情,以及您的标记是定义为所有边缘还是某些边缘边缘和一些填充。相反,只需使用 color 参数并知道您的整个标记将设置为您指定的单一颜色!

    【讨论】:

    • 当颜色是“要映射的值序列”(即不是固定参数而是您正在绘制的变量之一)时,这不起作用。您会收到一条错误消息,非常明确地告诉您改用 'c='。你知道当颜色为变量时如何得到'color='的效果吗?
    【解决方案4】:

    针对 zwol 在评论中提出的问题 - 我的声誉还不够高,无法离开 cmets,因此必须这样做:如果您的颜色来自颜色图(即,来自“值序列” mapped") 你可以使用color =,如下所示:

    from matplotlib import pyplot
    
    x = [1,5,8,9,5]
    y = [4,2,4,7,9]
    numSides = [2,3,1,1,5]
    
    cmap = pyplot.cm.get_cmap("copper_r")
    
    min, max = min(numSides), max(numSides)
    for i in range(len(x)):
        if numSides[i] >= 2:
            cax = pyplot.scatter(x[i], y[i], marker = '+', s = 100, c = numSides[i], cmap = cmap)
            cax.set_clim(min, max)
        elif numSides[i] == 1:
            pyplot.scatter(x[i], y[i], marker = '.', s = 40, color = cmap(numSides[i]))
    
    fig = pyplot.gcf()
    fig.set_size_inches(8.4, 6)
    fig.savefig('figure_test.png', dpi = 200)
    pyplot.show()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-13
      • 2021-10-10
      • 2014-12-16
      • 2015-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多