Краткий ответ: ваш график работает, за исключением того, что отфильтрованные значения не окрашены в красный цвет.
Основная проблема заключается в том, что кодировки всегда заменяют свойства меток, как вы можете видеть в этом более простом примере: ссылка редактора
{
"$schema": "https://vega.github.io/schema/vega-lite/v3.json",
"description": "A scatterplot showing horsepower and miles per gallons.",
"data": {"url": "data/cars.json"},
"mark": {"type": "point", "color": "red"},
"encoding": {
"x": {"field": "Horsepower", "type": "quantitative"},
"y": {"field": "Miles_per_Gallon", "type": "quantitative"},
"color": {"field": "Origin", "type": "nominal"},
"shape": {"field": "Origin", "type": "nominal"}
}
}
Обратите внимание, что, хотя мы указываем, что метка должна иметь красный цвет, это переопределяется кодировкой цвета. Это разработано в Vega-Lite, потому что кодировки более специфичны, чем свойства.
Возвращаясь к вашей диаграмме: поскольку вы указываете цветовую кодировку в родительской диаграмме, каждый отдельный слой наследует эту цветовую кодировку, и эти цвета переопределяют "color": "red"
, который вы указали в отдельных слоях.
Чтобы заставить его делать то, что вы хотите, вы можете переместить цветовую кодировку в отдельные слои (и использовать кодировку detail
, чтобы гарантировать, что данные все еще группируются по этому полю). Например ( ссылка для редактора ):
{
"$schema": "https://vega.github.io/schema/vega-lite/v3.json",
"data": {...},
"width": 1000,
"height": 200,
"autosize": {"type": "pad", "resize": true},
"transform": [
{
"window": [{"op": "rank", "as": "rank"}],
"sort": [{"field": "dateTime", "order": "descending"}]
},
{"filter": "datum.rank <= 100"}
],
"layer": [
{
"mark": {"type": "line"},
"encoding": {
"color": {
"field": "name",
"type": "nominal",
"legend": {"title": "Type"}
}
}
},
{
"mark": {"type": "line", "color": "red"},
"transform": [
{
"as": "count",
"calculate": "if(datum.anomaly == true, datum.count, null)"
},
{"calculate": "true", "as": "baseline"}
]
},
{
"mark": {"type": "circle", "color": "red"},
"transform": [
{"filter": "datum.anomaly == true"},
{"calculate": "true", "as": "baseline"}
]
}
],
"encoding": {
"x": {
"field": "dateTime",
"type": "temporal",
"timeUnit": "hoursminutesseconds",
"sort": {"field": "dateTime", "op": "count", "order": "descending"},
"axis": {"title": "Time", "grid": false}
},
"y": {
"field": "count",
"type": "quantitative",
"axis": {"title": "Count", "grid": false}
},
"detail": {"field": "name", "type": "nominal"}
}
}
Можно выполнить его в его собственном потоке и прервать поток. Просто остерегайтесь этого, которое могло бы оставить операцию в плохом состоянии.
Вместо этого необходимо создать флаг выхода, который поток проверяет в safepoints. Если это будет отмечено для выхода, то поток остановится, как только для него безопасно сделать так.
Поскольку Mark сказал, что необходимо реализовать некоторую совместную синхронизацию. Люди часто гравитируют к желанию использовать Поток. Прервитесь здесь..., но это - плохая идея.
Существует много вопросов, которые обращаются к этому, например, видят: "Есть ли хороший метод в C# для выдачи исключения на данном потоке".
Можно просто использовать компонент BackgroundWorker.
Это основано на событии и очень легко использовать. Выглядит очень подходящим для того, что Вы описываете.
Это имеет хорошую поддержку передачи сигналов отмены, а также прогресса, сообщающего также.
И много примеров кода Вы можете поиск на Google.
Установите свойство WorkerSupportsCancellation, таким образом, это верно.
backgroundworker1.WorkerSupportsCancellation = true;
Сделайте это перед запуском рабочего.
Затем в цикле можно опросить свойство CancellationPending:
if (backgroundWorker1.CancellationPending) return;
Просто пример, но необходимо получить идею.
Установите WorkerSupportsCancellation
свойство на Вашем BackgroundWorker
к истинному :-)
Вы также добрались для проверки CancellationPending
свойство в Вашем цикле, чтобы видеть, необходимо ли прерывать обработку. Статья MSDN, что связанный chakrit имеет хороший блок кода кода
Править: D'oh, Вы получили меня на несколько секунд там chakrit :)
спасибо за ответы. Это - a backgroundworker
но когда я использую backgroundworker1.cancelAsync();
Я получаю исключение:
"Этот BackgroundWorker заявляет, что не поддерживает отмену. Измените WorkerSupportsCancellation, чтобы указать, что он действительно поддерживает отмену"
Как я иду об изменении этого? Это наследовано код, извините!
Можно добавить кнопку отмены, которая устанавливает булев флаг
В цикле добавляют "Приложение. DoEvents" в ключевых пунктах и затем проверяют булев флаг. Если флаг был смещен, формует Вашу очистку и выходит из цикла.