Проверьте этот ответ на мой вопрос, который кажется очень похожим.
Что-то попробовать: вызвать ConfigureAwait(false)
в Задаче, возвращенной GetStreamAsync()
. Например,
var result = await httpClient.GetStreamAsync("weeklyplan")
.ConfigureAwait(continueOnCapturedContext:false);
Независимо от того, действительно ли это полезно, зависит от того, как вызывается этот код выше - в моем случае вызов метода async
с использованием Task.GetAwaiter().GetResult()
заставил код висеть.
Это связано с тем, что GetResult()
блокирует текущий поток, пока задача не завершится. Когда задача завершается, он пытается повторно ввести контекст потока, в котором он был запущен, но не может, потому что в этом контексте уже есть поток, который блокируется вызовом GetResult()
... deadlock!
Эта запись MSDN подробно рассказывает о том, как .NET синхронизирует параллельные потоки, и ответ на мой собственный вопрос дает некоторые рекомендации.
Ну, у вас есть несколько вариантов. Первое решение, которое сработало для меня, было 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")
Аргумент 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")
[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] Теперь, если честно, networkD3
сработал, но мне просто не удалось заставить его выглядеть достаточно хорошо.
РЕДАКТИРОВАТЬ 2 :
Вы также можете использовать geom_alluvium
вместо geom_flow
. Основное (визуальное) различие между ними заключается в том, что в geom_flow
цвет потока наследуется от соседних узлов (либо источника, либо цели). В geom_alluvium
он вместо этого наследуется от первого узла - например, Поток не изменит цвет при прохождении через узлы.
Если вы хотите объединить график с другим графиком, проще всего было бы использовать par(mfrow=c(1,2))
.