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$
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$ Jan 25 '13 at 19:41
  • $\begingroup$ @belisarius Yes, but only in his specific case ;) $\endgroup$ Jan 25 '13 at 19:42
  • $\begingroup$ @VitaliyKaurov Not now $\endgroup$ Jan 25 '13 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$ Jan 25 '13 at 19:44
  • $\begingroup$ @stevenvh I put it back ;) $\endgroup$ Jan 25 '13 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
    Jan 26 '13 at 7:04
  • $\begingroup$ @Mr.Wizard, I find this happens quite a lot the other way round :-) $\endgroup$ Jan 26 '13 at 17:56
  • $\begingroup$ I now know who to contact if I want to work on project with someone. $\endgroup$
    – Mr.Wizard
    Jan 26 '13 at 18:01

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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