7
$\begingroup$

Sample data:

data = {
   {{2013, 1, 1}, 24.13, 167.67, 231.82},
   {{2013, 1, 2}, 32.15, 170.92, 225.99},
   {{2013, 1, 3}, 35.43, 172.68, 221.67},
   {{2013, 1, 4}, 36.73, 173.05, 218.32},
   {{2013, 1, 5}, 58.19, 165.96, 197.05},
   {{2013, 1, 6}, 69.99, 163.50, 187.52},
   {{2013, 1, 7}, 71.37, 154.21, 175.58},
   {{2013, 1, 8}, 72.51, 149.66, 163.25}};

I want a DateListPlot with three graphs, so for a matrix formed by columns 1 and 2, one for columns 1 and 3, and 1 for columns 1 and 4. At the moment I'm using this code:

data2 = Transpose[{data[[All, 1]], data[[All, 2]]}];
data3 = Transpose[{data[[All, 1]], data[[All, 3]]}];
data4 = Transpose[{data[[All, 1]], data[[All, 4]]}];
DateListPlot[{data2, data3, data4}, Joined -> True, Filling -> {3 -> {1}}]

but I have a hunch that this can be done more efficiently. I don't like the Transposes in particular. Any ideas?


edit (for extra credit)
What if I need to multiply the second column by 2, which in my solution is simply

data2 = Transpose[{data[[All, 1]], 2 * data[[All, 2]]}];
$\endgroup$

2 Answers 2

8
$\begingroup$

This method allows you to define arbitrary column indexes, not necessarily that orderly as you have. Just put them in the list:

iNeed = {{1, 2}, {1, 3}, {1, 4}};

then this will do the job and make a plot identical to yours:

DateListPlot[data[[All, #]] & /@ iNeed, Joined -> True, Filling -> {3 -> {1}}]

basically it does this but in a shorter way:

DateListPlot[{
  data[[All, {1, 2}]],
  data[[All, {1, 3}]],
  data[[All, {1, 4}]]
  }, Joined -> True, Filling -> {3 -> {1}}]
$\endgroup$
5
  • 2
    $\begingroup$ Or DateListPlot[data[[;;, {1, #}]] & /@ {2,3,4}, Joined -> True, Filling -> {3 -> {1}}] $\endgroup$ Commented Jan 25, 2013 at 19:41
  • $\begingroup$ @belisarius Yes, but only in his specific case ;) $\endgroup$ Commented Jan 25, 2013 at 19:42
  • $\begingroup$ @VitaliyKaurov Not now $\endgroup$ Commented Jan 25, 2013 at 19:42
  • $\begingroup$ @stevenvh Thanks. I did almost the same than Vitaliy and he posted earlier. I don't think the small difference deserves another answer $\endgroup$ Commented Jan 25, 2013 at 19:44
  • $\begingroup$ @stevenvh I put it back ;) $\endgroup$ Commented Jan 25, 2013 at 19:45
7
$\begingroup$

Another variation, not as readable as Vitaliy's:

DateListPlot[Transpose[Tuples[{{#1}, {##2}}] & @@@ data], 
 Joined -> True, Filling -> {3 -> {1}}]

To multiple the second column by 2 just insert a multiplier list in front of {##2}:

DateListPlot[Transpose[Tuples[{{#1}, {2, 1, 1} {##2}}] & @@@ data], 
 Joined -> True, Filling -> {3 -> {1}}]
$\endgroup$
3
  • $\begingroup$ Simon, I love your style. Unfortunately it's mine too! I wrote the exact same code as your first line. :^) (Well, I use # rather than #1 but that's splitting hairs.) $\endgroup$
    – Mr.Wizard
    Commented Jan 26, 2013 at 7:04
  • $\begingroup$ @Mr.Wizard, I find this happens quite a lot the other way round :-) $\endgroup$ Commented Jan 26, 2013 at 17:56
  • $\begingroup$ I now know who to contact if I want to work on project with someone. $\endgroup$
    – Mr.Wizard
    Commented Jan 26, 2013 at 18:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.