Графическое представление списков - PullRequest
6 голосов
/ 03 марта 2011

Скажите, у меня есть три списка: a={1,5,10,15} b={2,4,6,8} и c={1,1,0,1,0}. Я хочу график, который имеет a в качестве оси x, b в качестве оси y и красную / черную точку для отметки 1/0. За. например Координата (5,4) будет иметь красную точку.
Другими словами, координата (a[i],b[i]) будет иметь красную / черную точку в зависимости от того, равен ли c[i] 1 или 0.
Я пробовал свои силы с ListPlot, но не могу понять варианты.

Ответы [ 5 ]

8 голосов
/ 03 марта 2011

Я предлагаю это.

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
]

Mathematica graphics

Или короче, но более запутанный

Graphics[
  {Hue[1, 1, #], Point@{##2}} & @@@ Thread@{c, a, b}, 
  Axes -> True, AxesOrigin -> 0
]
7 голосов
/ 03 марта 2011

Идея Леонида, возможно, более наивная.

f[a_, b_, c_] := 
 ListPlot[Pick[Transpose[{a, b}], c, #] & /@ {0, 1}, 
       PlotStyle -> {PointSize[Large], {Blue, Red}}]

f[a, b, c] 

enter image description here

Редактировать: просто для удовольствия

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]

enter image description here

6 голосов
/ 03 марта 2011

Вот ваши очки:

a = {1, 5, 10, 15};
b = {2, 4, 6, 8};
c = {1, 1, 0, 1};

(я удалил последний элемент из c, чтобы сделать его такой же длины, как a и b). Я бы порекомендовал сделать отдельные изображения для точек с нулями и единицами, а затем объединить их - в этой ситуации это кажется самым простым:

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}}]]]]

Вот использование:

showPoints[a, b, c]

enter image description here

5 голосов
/ 03 марта 2011

Одна возможность:

ListPlot[List /@ Transpose[{a, b}], 
 PlotMarkers -> {1, 1, 0, 1} /. {1 -> { Style[\[FilledCircle], Red], 10}, 
   0 -> { { Style[\[FilledCircle], Black], 10}}}, 
 AxesOrigin -> {0, 0}]

Предоставление в качестве вывода:

enter image description here

4 голосов
/ 03 марта 2011

Вы можете получить аналогичные результаты (с Леонидом), используя Графику:

    Graphics[{PointSize[.02], Transpose[{(c/. {1 -> Red, 0 -> Black}), 
              Point /@ Transpose[{a, b}]}]},
              Axes -> True, AxesOrigin -> {0, 0}]

Using Graphics instead of ListPlot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...