在Mathematica中的ListPlot和ErrorListPlot中如何实现点的个性化着色?

10

我可以通过像这样做一些事情来获得带颜色的 ListLinePlot

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

Mathematica绘图

然而,如帮助文件所示("ColorFunction需要至少一个数据集被Joined"),如果我进行等效操作

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

Mathematica graphics

我的所有点都是蓝色的。有没有一种简单的方法可以让ColorFunctionListPlot中与Joined -> False一起使用?

也就是说,有没有更好的方法来实现类似于下面这样的效果:

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

请问有人能解释一下为什么在Mathematica中,使用ColorFunction需要加上Joined -> True参数吗?另外,有没有办法在ErrorBarPlots包中的ErrorListPlot中实现类似的着色效果?

Mathematica图形

编辑:我也在寻找一种在ErrorBarPlots包中的ErrorListPlot中实现类似着色的方法。

3个回答

7

问题在于,Joined->True 会画一条 Line[],每个包含点可以给出 VertexColors。我认为当设置 Joined->False 时,为点做同样的事情会导致无法正常工作的情况。然而,在您的案例中,Line[] 和 Point[] 的功能基本相同。那么这是怎么回事呢?

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

Mathematica图形

顺便提一下,如果你只使用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]

Mathematica graphics


ErrorBarPlots包中是否有类似于ErrorListPlot的好解决方案? - Jason Gross
你可以在绘制线条的代码中添加类似于 PlotStyle -> AbsolutePointSize[5] 的内容来控制最终点的大小。 - Mike Honeychurch
@Jason,像上面那样简单的技巧无法给ErrorListPlot着色,至少有两个原因:应该具有相同颜色的对象被分成了几个图形指令。您需要找到相应的线条和点。第二个原因是,一个点有一个位置用于颜色。ErrorBar有几个不同的位置。因此,不清楚您要使用哪个位置进行着色。检查您的ErrorListPlotInputForm - halirutan

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

Mathematica图形

如果您要绘制一组 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]

Mathematica 图形

似乎很奇怪的是,DiscretePlot 可以让你用不同的颜色来着色数据点,而 ListPlot 却不能。我确定这一定与实现细节有关,但我想不出为什么会这样。


1

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

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

c1是第一个数据点的颜色,以此类推。颜色列表可以通过编程方式生成,例如:

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

这里是结果。

这种方法的优点如下:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接