Yığılmış zaman serisi grafiği

Oct 21 2020

Farklı birimlerde ölçülen birden çok zaman serim var. Ortak bir x ekseni ile verilerimin yığılmış bir grafiğine sahip olmak istiyorum. Burada bir örnek olabilir . Örnek olarak, işte verilerim.

nobs = 100;
TS1= RandomVariate[NormalDistribution[0, 1], nobs];
TS2= Accumulate[RandomVariate[NormalDistribution[0, 5], nobs]];
TS3= RandomInteger[{-10, 100}, nobs];
dates = DateRange[DatePlus[Today, Quantity[-nobs + 1, "Days"]], Today];
mytsdata = TimeSeries[#, {dates}] & /@ {TS1, TS2, TS3};
mergeddata = TimeSeriesThread[# &, mytsdata];

Veri setimi veya grafiklerini kullanabilirim DateListPlotveya bu grafiklerin hiçbiri ilgimi çekmiyor. MATLAB kullanarak bir grafik oluşturdum ve buna benziyor.StackedDateListPlotmytsdatamergeddata

Ma kodlarını kullanarak benzer bir grafik oluşturmak mümkün mü? Grafik özelliklerini değiştirme esnekliği çok değer katacaktır. Temel gereksinim, bir ve yalnızca bir x ekseni olması gerektiğidir. Zaman serileri farklı uzunluklarda olabilir.

Güncelleme: Farklı uzunluklara sahip birkaç zaman serisinin listesi burada.

nobs = 100;
dates = DateRange[DatePlus[Today, Quantity[-nobs + 1, "Days"]], Today];
s1 = RandomVariate[NormalDistribution[0, 1], nobs];
s1ts = TimeSeries[s1, {dates}];
s2 = Accumulate[RandomVariate[NormalDistribution[0, 5], nobs - 25]];
s2ts = TimeSeries[s2, {dates[[26 ;;]]}];
s3 = RandomInteger[{-10, 100}, nobs - 50];
s3ts = TimeSeries[s3, {dates[[51 ;;]]}];
mergeddata2 = 
  TimeSeriesThread[# &, {s1ts, s2ts, s3ts}, 
   ResamplingMethod -> Missing[]];

mergeddata2Aşağıdaki gibi çizmek istiyorum .

Grafiğin altındaki Time ve 2020 gerekli değildir. Şimdiden teşekkür ederim.

Güncelleme 2:

Rohit'in önerisini kullanarak grafiğimi aşağıdaki kodlarla oluşturabildim:

drange = {mergeddata2["Dates"][[1]], mergeddata2["Dates"][[-1]]};
ResourceFunction["PlotGrid"][{
  {DateListPlot[s1ts, Frame -> True, 
    PlotRange -> {drange, Automatic}]},
  {DateListPlot[s2ts, Frame -> True, 
    PlotRange -> {drange, Automatic}]},
  {DateListPlot[s3ts, Frame -> True, PlotRange -> {drange, Automatic}]}
  }
 ]

Daha fazla iyileştirme için herhangi bir öneri memnuniyetle karşılanacaktır.

Yanıtlar

6 RohitNamjoshi Oct 21 2020 at 20:02

PlotGrid kaynak işlevi , düzeni ve eksenleri kontrol etmek için birçok seçeneğe sahiptir.

ResourceFunction["PlotGrid"][mytsdata // Map[DateListPlot /* List]]

4 Jagra Oct 21 2020 at 19:39

Bu size istediğinizin çoğunu verir.

Bununla birlikte, mevcut çözüme ulaşmak için bu yazıyı birkaç kez düzenledim.

Grid[{
{"TS1",DateListPlot[mytsdata[[1]], ImageSize -> 350, AspectRatio -> 1/2, ImagePadding -> {{25, 1}, {0, 0}}]},
{"TS2", DateListPlot[mytsdata[[2]], ImageSize -> 350, AspectRatio -> 1/2, ImagePadding -> {{25, 1}, {0, 0}}]},
{"TS3", DateListPlot[mytsdata[[3]], ImageSize -> 350, AspectRatio -> 1/2, ImagePadding -> {{25, 1}, {15, 0}}]},
{"", "TIME               2020"}
},
Alignment -> {Right, Left}]

Bazı açıklamalar aşağıdadır ...

Mathematica, en azından benim bildiğim kadarıyla, istediğinizi doğrudan yapmanızı sağlamıyor.

Benim çözümüm, Gridistediğiniz grafiklerin yağmalanmasını kopyalamak için kullanıyor .

Gördüğünüz gibi Grid3 DateListPlots'ye sahip.

ImagePaddingGrafiklerin sol dikey eksenlerini hizalamak için kullanıyorum . Bunu yapmanın otomatik bir yolunu bulamadım. Belki başka birinin bir önerisi vardır.

Ayrıca ImagePadding, en üstteki 2 grafik için alt ay etiketlerini gizlemesi için birbirini izleyen her arsa üzerinde üst üste binmek için kullanıyorum. Bunu yapmanın başka yolları da var. Bakalım diğer cevapların ne getireceği.

Ayrıca, TIME ve 2020 bilgilerinizi sayfanın alt satırına ekledim Grid.

3 joka Oct 21 2020 at 22:23

Sadece TimeSeriesnesnelerin benzersiz zaman imzalarına sahip olduğundan emin olmak için , rastgele aralıklı tarih aralıkları oluşturan birkaç işlev yazdım . Bu aralıklar Todayartı veya eksi rasgele sayıda günden başlar ve belirli bir adım sayısı için zamanda geriye gider .

Ayrıca, birkaç farklı rasgele tarih aralığı için ortak aralığı döndüren bir işlev sağlıyorum (yukarıda açıklandığı gibi).

Son olarak, kod bölümünde, bir dizi değer listesi ve bunlara karşılık gelen tarih listelerini TimeSeriesnesneler halinde oluşturan bir işlev vardır .

Clear[randf, randomDate, aroundToday, randomDates]

(* Returns an integer between 3 and 7 *)
randf = (RandomInteger[{3, 7}, #] &) /* First;

(* Returns a date that is a random number of days before the input date *)
randomDate[date_, random_ : randf, unit_ : "Days"] := DatePlus[date, {-random[1], unit}];

(* Returns a random number of days before of after Today's date *)
aroundToday[random_ : randf, unit_ : "Days"] := DatePlus[Today, {RandomChoice[{-1, 1}] random[1], unit}];

(* Returns n randomly generated days starting from around Today and going back in random number of steps *)
randomDates[n_, random_ : randf, unit_ : "Days"] := With[{r = randomDate[#, random, unit] &},
  NestList[r, aroundToday[random, unit], n] // Reverse
 ]

(* Accepts lists of dates and returns their common range *)
dateRange[dates__] := Map[Through[{Min, Max}[#]] &, {dates}] // Transpose /* (
  MapThread[Construct, {{Min, Max}, #}] &)

(* Composes TimeSeries objects from a list of date lists and a list of value lists *)
(* A working assumption is that corresponding dates and values sublists are of the same Length ns[i]] *)
(* The returned TimeSeries have a random number of the original entries removed *)
makeTimeSeries[dates_, values_, ns_, random_ : randf] := MapThread[
  With[{t = #1, y = #2, is = RandomInteger[{1, #3}, randf[1]]},
    TimeSeries[#2, {#1}] & @@ Transpose[ReplacePart[Transpose[{t, y}], is -> Nothing // Thread]]
   ] &, {dates, values, ns}]

Yukarıdaki kodu kullanarak , OP düzenlemesinde farklı uzunluklara sahip veriler olan, verilen değerler için gerçekten tekdüze olmayan aralıklı tarihler oluşturabiliriz {s1, s2, s3}.

(* Obtained required data lengths *)
ns = Length /@ {s1, s2, s3};

(* Generate randomly spaced dates, starting from Today and extending back into the past *)
dates = Table[randomDates[n - 1], {n, ns}];

(* Finally, compose the corresponding TimeSeries objects *)
mytsdata = makeTimeSeries[dates, {s1, s2, s3}, ns]

(* Record the common range of the various date lists *)
rng = dateRange @@ ((#["Dates"] &) /@ mytsdata)

Benim sistemimde, yukarıdaki kodun bir değerlendirmesi örn.

Lütfen, tüm zaman serilerinin nasıl farklı aralıklara ve farklı sayıda gözlemlere sahip olduğuna dikkat edin.

Şimdi, OP'ye bir cevap verebilmek için aşağıdaki işlevi kullandım:

ClearAll[manyPlots]
Options[manyPlots] = {"Plot1" -> None, "Plot2" -> None, "Plot3" -> None};
manyPlots[ts_, opts : OptionsPattern[manyPlots]] := Module[{opts1, opts2, opts3, allOpts},
  allOpts = {opts1, opts2, opts3} = OptionValue[{"Plot1", "Plot2", "Plot3"}];
  MapThread[DateListPlot[#1, Apply[Sequence, #2]] &, {ts, allOpts}] // List /* Transpose /* GraphicsGrid
 ]

manyPlotsFonksiyonu, kullanıcı çeşitli araziler için farklı seçenekler geçmesine izin verir. Örneğin.

manyPlots[mytsdata, 
  "Plot1" -> {PlotLabel -> "a", PlotRange -> {rng, Automatic}}, 
    "Plot2" -> {PlotLabel -> "b", PlotRange -> {rng, Automatic}, PlotStyle -> ColorData[97, "ColorList"][[2]]}, 
      "Plot3" -> {PlotLabel -> "c", PlotRange -> {rng, Automatic}, PlotStyle -> ColorData[97, "ColorList"][[3]]}]

grafiklere farklı etiketler sağlar ve hepsinin ortak aralıklarında görüntülenmesini sağlar. Ayrıca, PlotStyleikinci ve üçüncü arsa için değiştirir .

Bu yaklaşımla yerleştirilebilecek başka birçok değişiklik olduğunu düşünüyorum.