Одним из способов сделать это было бы расширение вашего класса дополнительным методом, который объединит список TimeLapse
объектов, взяв все перекрывающиеся и объединив их в один TimeLapse
, а затем вернув этот набор. Если мы сделаем это, то мы можем просто сложить продолжительность каждого элемента в наборе. Вы также можете добавить свойство, которое предоставляет Duration
объекта TimeLapse
:
private class TimeLapse
{
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
public TimeSpan Duration => (EndTime - StartTime).Duration();
public static List Merge(List items)
{
if (items == null || items.Count < 2) return items;
var results = new List();
foreach (var item in items)
{
var overlappingItem = results.FirstOrDefault(item.OverlapsWith);
if (overlappingItem == null) results.Add(item);
else overlappingItem.CombineWith(item);
}
return results;
}
private bool OverlapsWith(TimeLapse other)
{
return other != null &&
other.StartTime <= EndTime &&
other.EndTime >= StartTime;
}
private void CombineWith(TimeLapse other)
{
if (!OverlapsWith(other)) return;
if (other.StartTime < StartTime) StartTime = other.StartTime;
if (other.EndTime > EndTime) EndTime = other.EndTime;
}
}
Ниже приведен пример того, как вы можете отображать длительности для каждого элемента в вашем словаре.
Я включил метод для создания фиктивного списка устройств, поэтому я использую Days
, потому что его было проще писать и проверять правильность результатов, но поскольку Duration
является [118 ], вы можете получить практически любую единицу измерения (например, TotalSeconds
в вашем случае):
private static void Main()
{
Dictionary> devices = GetDeviceList();
foreach (var device in devices)
{
Console.WriteLine("{0}: {1} total days", device.Key,
TimeLapse.Merge(device.Value).Sum(value => value.Duration.TotalDays));
}
GetKeyFromUser("Done! Press any key to exit...");
}
private static Dictionary> GetDeviceList()
{
return new Dictionary>
{
// device1 total should be 4 days (1/1 - 1/5)
{"device1", new List{
new TimeLapse {StartTime = DateTime.Parse("1/1/2019"),
EndTime = DateTime.Parse("1/3/2019")},
new TimeLapse {StartTime = DateTime.Parse("1/2/2019"),
EndTime = DateTime.Parse("1/3/2019")},
new TimeLapse {StartTime = DateTime.Parse("1/3/2019"),
EndTime = DateTime.Parse("1/5/2019")}}},
// device2 total should be 7 days (1/1 - 1/4 plus 1/6 - 1/10)
{"device2", new List{
new TimeLapse {StartTime = DateTime.Parse("1/1/2019"),
EndTime = DateTime.Parse("1/3/2019")},
new TimeLapse {StartTime = DateTime.Parse("1/3/2019"),
EndTime = DateTime.Parse("1/4/2019")},
new TimeLapse {StartTime = DateTime.Parse("1/6/2019"),
EndTime = DateTime.Parse("1/10/2019")}}},
// device3 total should be 2 days (1/1 - 1/2 plus 1/6 - 1/7)
{"device3", new List{
new TimeLapse {StartTime = DateTime.Parse("1/1/2019"),
EndTime = DateTime.Parse("1/2/2019")},
new TimeLapse {StartTime = DateTime.Parse("1/6/2019"),
EndTime = DateTime.Parse("1/7/2019")}}},
// device4 total should be 2 days (1/1 - 1/3)
{"device4", new List{
new TimeLapse {StartTime = DateTime.Parse("1/1/2019"),
EndTime = DateTime.Parse("1/3/2019")}}},
};
}
Вывод
Если вы просто хотите, чтобы два разных окна были открыты одновременно, используйте dev.new
, например
plot(1:10)
dev.new()
plot(10:1)
Если вы хотите нарисовать два графика в одном и том же окне, то, как упоминал Шейн, установите параметр mfrow
.
par(mfrow = c(2,1))
plot(1:10)
plot(10:1)
Если вы хотите попробовать что-то более продвинутое, то вы можете взглянуть на решетчатую графику или ggplot, оба из которых отлично подходят для создания условных графиков (графиков, где разные подмножества данных появляются в разных кадрах) .
Пример решетки:
library(lattice)
dfr <- data.frame(
x = rep(1:10, 2),
y = c(1:10, 10:1),
grp = rep(letters[1:2], each = 10)
)
xyplot(y ~ x | grp, data = dfr)
Пример ggplot. (Сначала вам нужно скачать ggplot из CRAN.)
library(ggplot2)
qplot(x, y, data = dfr, facets = grp ~ .)
#or equivalently
ggplot(dfr, aes(x, y)) + geom_point() + facet_grid(grp ~ .)
Если вы хотите 2 графика в отдельных окнах или файлах, вы можете выбрать новые устройства перед вызовом каждой команды графика. См .:
? Устройства
И,
? Dev.cur
Попробуйте использовать пар
перед печатью.
par(mfrow = c(2, 1))
Альтернативный ответ - назначить график как объект, а затем вы можете отображать его, когда захотите т.е.
abcplot<-plot(pc) title(main='abc',xlab='xx',ylab='yy')
sdfplot<-plot(pcs) title(main='sdf',xlab='sdf',ylab='xcv')
abcplot # Displays the abc plot
sdfplot # Displays the sdf plot
abcplot # Displays the abc plot again
Вы также можете попробовать команду layout:
Попробуйте
layout(1:2)
plot(A)
plot(B)
Команда try x11 ()
перед каждым графиком, вот пример:
x11()
plot(1:10)
x11()
plot(rnorm(10))
Это приведет к разным окнам графика. Вы можете добавить команду «par» к любому из этих окон x11 ()
и получить больше разнообразных графиков, то есть 4 графика в одном окне, а большой график в другом окне.