Как разделить два графика в R?

Одним из способов сделать это было бы расширение вашего класса дополнительным методом, который объединит список 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")}}},
    };
}

Вывод

[1111 ] enter image description here

23
задан phoxis 1 June 2012 в 05:11
поделиться

6 ответов

Если вы просто хотите, чтобы два разных окна были открыты одновременно, используйте 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 ~ .)
39
ответ дан 29 November 2019 в 01:14
поделиться

Если вы хотите 2 графика в отдельных окнах или файлах, вы можете выбрать новые устройства перед вызовом каждой команды графика. См .:

? Устройства

И,

? Dev.cur

0
ответ дан 29 November 2019 в 01:14
поделиться

Попробуйте использовать пар перед печатью.

 par(mfrow = c(2, 1))
14
ответ дан 29 November 2019 в 01:14
поделиться

Альтернативный ответ - назначить график как объект, а затем вы можете отображать его, когда захотите т.е.

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
0
ответ дан 29 November 2019 в 01:14
поделиться

Вы также можете попробовать команду layout:

Попробуйте layout(1:2)

plot(A)    
plot(B)
4
ответ дан 29 November 2019 в 01:14
поделиться

Команда try x11 () перед каждым графиком, вот пример:

x11()
plot(1:10)
x11()
plot(rnorm(10))

Это приведет к разным окнам графика. Вы можете добавить команду «par» к любому из этих окон x11 () и получить больше разнообразных графиков, то есть 4 графика в одном окне, а большой график в другом окне.

2
ответ дан 29 November 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: