Reputation: 452
Say I have three lists: a={1,5,10,15} b={2,4,6,8}
and c={1,1,0,1,0}
. I want a plot which has a
as the x
axis, b
as the y
axis and a red/black dot to mark 1/0. For. e.g. The coordinate (5,4)
will have a red dot.
In other words the coordinate (a[i],b[i])
will have a red/black dot depending on whether c[i]
is 1 or 0.
I have been trying my hand with ListPlot
but can't figure out the options.
Upvotes: 6
Views: 436
Reputation: 24336
I suggest this.
a = {1, 5, 10, 15};
b = {2, 4, 6, 8};
c = {1, 1, 0, 1};
Graphics[
{#, Point@{##2}} & @@@
Thread@{c /. {1 -> Red, 0 -> Black}, a, b},
Axes -> True, AxesOrigin -> 0
]
Or shorter but more obfuscated
Graphics[
{Hue[1, 1, #], Point@{##2}} & @@@ Thread@{c, a, b},
Axes -> True, AxesOrigin -> 0
]
Upvotes: 8
Reputation: 61046
Leonid's idea, perhaps more naive.
f[a_, b_, c_] :=
ListPlot[Pick[Transpose[{a, b}], c, #] & /@ {0, 1},
PlotStyle -> {PointSize[Large], {Blue, Red}}]
f[a, b, c]
Edit: Just for fun
f[h_, a_, b_, c_, opt___] :=
h[Pick[Transpose[{a, b}], c, #] & /@ {0, 1},
PlotStyle -> {PointSize[Large], {Blue, Red}}, opt]
f[ ListPlot,
Sort@RandomReal[1, 100],
Sin[(2 \[Pi] #)/100] + RandomReal[#/100] & /@ Range[100],
RandomInteger[1, 100],
Joined -> True,
InterpolationOrder -> 2,
Filling -> Axis]
Upvotes: 7
Reputation: 3066
You could obtain similar results (to those of Leonid) using Graphics:
Graphics[{PointSize[.02], Transpose[{(c/. {1 -> Red, 0 -> Black}),
Point /@ Transpose[{a, b}]}]},
Axes -> True, AxesOrigin -> {0, 0}]
Upvotes: 4
Reputation: 4284
One possibility:
ListPlot[List /@ Transpose[{a, b}],
PlotMarkers -> {1, 1, 0, 1} /. {1 -> { Style[\[FilledCircle], Red], 10},
0 -> { { Style[\[FilledCircle], Black], 10}}},
AxesOrigin -> {0, 0}]
Giving as output:
Upvotes: 5
Reputation: 22579
Here are your points:
a = {1, 5, 10, 15};
b = {2, 4, 6, 8};
c = {1, 1, 0, 1};
(I deleted the last element from c
to make it the same length as a
and b
). What I'd suggest is to separately make images for points with zeros and ones and then combine them - this seems easiest in this situation:
showPoints[a_, b_, c_] :=
With[{coords = Transpose[{a, b}]},
With[{plotF = ListPlot[Pick[coords, c, #], PlotMarkers -> Automatic, PlotStyle -> #2] &},
Show[MapThread[plotF, {{0, 1}, {Black, Red}}]]]]
Here is the usage:
showPoints[a, b, c]
Upvotes: 6