Re: Graph by Date
- To: mathgroup at smc.vnet.net
- Subject: [mg93255] Re: [mg93212] Graph by Date
- From: Darren Glosemeyer <darreng at wolfram.com>
- Date: Sat, 1 Nov 2008 05:09:33 -0500 (EST)
- References: <200810310806.DAA10661@smc.vnet.net>
Charles L. Snyder wrote: > Hi > > Although I've searched the Mathematica documentation and this > newsgroup's files, I am having trouble producing a Plot by Month - > specifically a graph by month on the x-axis, and a total of the values > in column 3 for that month: eg., > > mydata = {{1/5/2004, "widgetA", 55.2},{1/15/2004, "widgetD32", 5.2}, > {2/7/2004, "no_Widgets", 34.5},{5/6/2004, "widget62", 100.2}, > {5/16/2004, "widget6", 30.5},{9/13/2004, "widget 55t", 225.79}} > > result would be a graph of > Jan 2004 57.4 (55.2+5.2) > Feb 2004 34.2 > Mar 2004 0 > April 2004 0 > May 2004 130.7 (100.2 + 30.5) > June 2004 0 > July 2004 0 > Aug 2004 0 > Sep 2004 225.79 > all other months 0 > > I did find a way to summarize the dates and plot it: > > data = #[[1]] & /@ mydata; > cs = Tally[Sort[data]]; > > DateListPlot[cs, Filling -> Bottom, > FillingStyle -> Blue, PlotStyle -> {Red, PointSize[Large]}, > PlotRange -> {{{2004, 1}, {2004, 12}}, Automatic}, > DateTicksFormat -> {"Month", "/", "YearShort"}] > > Even this gives me the error messages for the dates such as - > DateList::ambig: "Warning: the interpretation of the string \ > \!\(\"10/1/2004\"\) as a date is ambiguous" > > Thanks again > > clsnyder > Here is one way. In[1]:= mydata = {{"1/5/2004", "widgetA", 55.2}, {"1/15/2004", "widgetD32", 5.2}, {"2/7/2004", "no_Widgets", 34.5}, {"5/6/2004", "widget62", 100.2}, {"5/16/2004", "widget6", 30.5}, {"9/13/2004", "widget 55t", 225.79}}; The following function will be used in comparing the months of the data points. If your data were to run over multiple years, you could replace "Month" by {"Month", "Year"} to compare month and year. In[2]:= stringfun[date_] := DateString[{date, {"MonthShort", "DayShort", "Year"}}, "Month"] Now split the data (with the middle column omitted) based on the month. This assumes the data are in chronological order. In[3]:= monthgroups = Split[mydata[[All, {1, 3}]], stringfun[#1[[1]]] === stringfun[#2[[1]]] &] Out[3]= {{{1/5/2004, 55.2}, {1/15/2004, 5.2}}, {{2/7/2004, 34.5}}, > {{5/6/2004, 100.2}, {5/16/2004, 30.5}}, {{9/13/2004, 225.79}}} Take the month and year for the first element in each group and add up the second elements in each subgroup to get monthly totals. In[4]:= groupedcounts = Map[{DateString[{#[[1, 1]], {"MonthShort", "DayShort", "Year"}}, {"Month", "/", "Year"}], Total[#[[All, -1]]]} &, monthgroups] Out[4]= {{01/2004, 60.4}, {02/2004, 34.5}, {05/2004, 130.7}, {09/2004, 225.79}} Now the data can be plotted. In[5]:= DateListPlot[groupedcounts] Out[5]= -Graphics- To fill in 0s for other months, you can create a table of {{"Month","/","Year"},0} pairs over the desired time range, select the dates not represented in the original data and combine that with the grouped data. In[6]:= zeromonths = Select[Table[{DateString[{2004, i}, {"Month", "/", "Year"}], 0}, {i, 9}], Not[MemberQ[groupedcounts[[All, 1]], #[[1]]]] &] Out[6]= {{03/2004, 0}, {04/2004, 0}, {06/2004, 0}, {07/2004, 0}, {08/2004, 0}} In[7]:= DateListPlot[Join[groupedcounts, zeromonths]] Out[7]= -Graphics- Also in the DateListPlot sent, there is an ambiguity message issued because some date strings could be interpreted as month/day/year or day/month/year. The option DateFunction -> (DateList[{#, {"MonthShort", "DayShort", "Year"}}] &) could be added to avoid the ambiguity and the message. Darren Glosemeyer Wolfram Research