【问题标题】:Individual point coloring in ListPlot, ErrorListPlot in MathematicaListPlot 中的单个点着色,Mathematica 中的 ErrorListPlot
【发布时间】:2012-01-31 01:34:17
【问题描述】:

我可以通过类似的操作获得彩色的ListLinePlot

ListLinePlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False]

但是,如帮助文件所示(“ColorFunction 要求至少一个数据集为Joined”),如果我执行等效操作

ListPlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False]

我所有的分数都是蓝色的。有没有一种很好的方法可以让ColorFunctionJoined -> False 一起为ListPlot 工作?

也就是说,有没有更好的方法来获得类似的东西

ListPlot[
 List /@ Transpose[{Range[(680 - 420)/20 + 1], Range[420, 680, 20]}], 
 PlotMarkers -> ({Graphics[{#, Disk[]}], 0.05} & /@ ColorData["VisibleSpectrum"] /@ Range[420, 680, 20])
]

?

(另外,有没有人解释一下为什么 Mathematica 需要Joined -> True 才能使用ColorFunction?)

编辑:我也在寻找一种方法,在 ErrorBarPlots 包中使用 ErrorListPlot 进行类似的着色。

【问题讨论】:

    标签: colors wolfram-mathematica plot points


    【解决方案1】:

    你可以使用DiscretePlot:

    data = Range[420, 680, 20];
    DiscretePlot[data[[i]], {i, Length[data]},
       ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False,
       Filling -> None]
    

    如果您要绘制 x,y 点列表,它会变得有点棘手:

    data = Transpose[{Range[420, 680, 20], Range[400, 530, 10]}];
    mapping = Apply[Rule, data, 2];
    DiscretePlot[i/.mapping, {i, data[[;;,1]]},
       ColorFunction -> "VisibleSpectrum", ColorFunctionScaling -> False,
       Filling -> None]
    

    DiscretePlot 可以让您对点进行不同的着色,而ListPlot 不会,这似乎很奇怪。我确信它一定与实现细节有关,但我想不出为什么会这样。

    【讨论】:

      【解决方案2】:

      问题是,Joined->True 绘制了一个 Line[],可以为每个包含点指定 VertexColors。我假设在设置 Joined->False 时对这些点做同样的事情会导致它不起作用的情况。尽管如此, Line[] 和 Point[] 在您的情况下工作几乎相同。那么是什么

      ListLinePlot[Range[420, 680, 20], ColorFunction -> "VisibleSpectrum", 
        ColorFunctionScaling -> False] /. Line[arg___] :> Point[arg]
      

      顺便说一句,如果您只使用 ListLinePlot,其中唯一的 Line[] 指令来自您的数据,即使您有更多数据集和 {x,y} 坐标,这也应该有效

      data = Transpose[Table[{{x, Sin[x]}, {x, Cos[x]}}, {x, 0, 2 Pi, 0.2}]];
      ListLinePlot[data, ColorFunction -> Hue] /. Line[arg___] :> Point[arg]
      

      【讨论】:

      • ErrorBarPlots 包中的ErrorListPlot 是否有类似的好解决方案?
      • 您可以在代码中添加类似PlotStyle -> AbsolutePointSize[5] 的内容——即绘制线条的代码——来控制最终的点大小。
      • @Jason,ErrorListPlot 不能用上面这样的小技巧来着色,至少有两个原因:应该有相同颜色的对象被分成几个图形指令。您必须找到相应的线和点。第二个原因是,one 点具有用于颜色的 one 位置。 ErrorBar 有几个不同的位置。所以不清楚你喜欢用哪一种颜色。检查您的ErrorListPlotInputForm
      【解决方案3】:

      我在工作中也遇到过这个问题。我通过以下方式为每个点分配颜色:

      data = ...
      ListPlot[data] /. Point[args___] :> Point[args, VertexColors -> {c1, c2, ...}]
      

      其中c1 是第一个数据点的颜色,依此类推。颜色列表可以通过程序生成,例如

      ColorData["Rainbow"] /@ (Range@Length@data / Length@data)
      

      Here is the result.

      这种方法的优点如下。

      • 很简单:我们有一个配对列表,然后我们创建一个对应的颜色列表。
      • 我们原来的ListPlot代码不需要修改(例如,改为ListLinePlot)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多