Как создать диаграмму Санки в R, показывающую изменения во времени для того же узла?

Проверьте этот ответ на мой вопрос, который кажется очень похожим.

Что-то попробовать: вызвать ConfigureAwait(false) в Задаче, возвращенной GetStreamAsync(). Например,

var result = await httpClient.GetStreamAsync("weeklyplan")
                             .ConfigureAwait(continueOnCapturedContext:false);

Независимо от того, действительно ли это полезно, зависит от того, как вызывается этот код выше - в моем случае вызов метода async с использованием Task.GetAwaiter().GetResult() заставил код висеть.

Это связано с тем, что GetResult() блокирует текущий поток, пока задача не завершится. Когда задача завершается, он пытается повторно ввести контекст потока, в котором он был запущен, но не может, потому что в этом контексте уже есть поток, который блокируется вызовом GetResult() ... deadlock!

Эта запись MSDN подробно рассказывает о том, как .NET синхронизирует параллельные потоки, и ответ на мой собственный вопрос дает некоторые рекомендации.

0
задан Daniela Rodrigues 5 April 2019 в 19:22
поделиться

1 ответ

Ну, у вас есть несколько вариантов. Первое решение, которое сработало для меня, было ggplot / geom_flow:

# requires(ggplot2)
# requires(ggalluvial)

# faking the data for 20 patients
set.seed(42)
individual <- as.character(rep(1:20,each=5))
timeperiod <- paste0(rep(c(0, 18,36,54,72),20),"_week")
therapy <- factor(sample(c("Etanercept", "Infliximab", "Rituximab",  "Adalimumab","Missing"), 100, replace=T))
d <- data.frame(individual, timeperiod, therapy)
head(d)

# Plotting it
ggplot(d, aes(x = timeperiod, stratum = therapy, alluvium = individual, fill = therapy, label = therapy)) +
  scale_fill_brewer(type = "qual", palette = "Set2") +
  geom_flow(stat = "alluvium", lode.guidance = "rightleft", color = "darkgray") +
  geom_stratum() +
  theme(legend.position = "bottom") +
  ggtitle("Treatment across observation period")

enter image description here

Аргумент stat = "alluvium" в [ 116] должно позволять отслеживать отдельных пациентов, но если вы хотите, вы также можете объединить потоки:

ggplot(d, aes(x = timeperiod, stratum = therapy, alluvium = individual, fill = therapy, label = therapy)) +
  scale_fill_brewer(type = "qual", palette = "Set2") +
  geom_flow(color = "darkgray") +
  geom_stratum() +
  theme(legend.position = "bottom") +
  ggtitle("Treatment across observation period")

enter image description here [1114]

[1131 ] РЕДАКТИРОВАТЬ 1 : Если вы хотите, чтобы у некоторых пациентов поток прекратился (например, терапия завершилась), вы можете легко сделать это, установив этих пациентов как NA:

# setting 3 pantients as NA for the last timepoint
d[which(d$individual==3 & d$timeperiod=="72_week"), ]["therapy"] <- NA 
d[which(d$individual==6 & d$timeperiod=="72_week"), ]["therapy"] <- NA 
d[which(d$individual==9 & d$timeperiod=="72_week"), ]["therapy"] <- NA 

# making the plot:
ggplot(d, aes(x = timeperiod, stratum = therapy, alluvium = individual, fill = therapy, label = therapy)) +
scale_fill_brewer(type = "qual", palette = "Set2") +
geom_flow(stat = "alluvium", lode.guidance = "rightleft", color = "darkgray") + 
geom_stratum(alpha=0.75) +
theme(legend.position = "bottom") +
ggtitle("Treatment across observation period")

[ 1119] enter image description here Теперь, если честно, networkD3 сработал, но мне просто не удалось заставить его выглядеть достаточно хорошо.

РЕДАКТИРОВАТЬ 2 :

  • Вы также можете использовать geom_alluvium вместо geom_flow. Основное (визуальное) различие между ними заключается в том, что в geom_flow цвет потока наследуется от соседних узлов (либо источника, либо цели). В geom_alluvium он вместо этого наследуется от первого узла - например, Поток не изменит цвет при прохождении через узлы.

  • Если вы хотите объединить график с другим графиком, проще всего было бы использовать par(mfrow=c(1,2)).

0
ответ дан Oka 5 April 2019 в 19:22
поделиться
Другие вопросы по тегам:

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