Использование plotlib для создания SVG завершается неудачно с «неверным y_range» - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь посчитать буквы в сообщении и экспортировать их в изображение.

Я успешно создал BTreeMap с буквами и посчитал их. У меня проблемы с экспортом в SVG с помощью plotlib. Я открыт для использования других библиотек, но я чувствую, что моя проблема в том, чтобы использовать библиотеку больше, чем сама библиотека.

Вот мой код для счетчика

Cargo.toml

[dependencies]
plotlib = "0.4.0"

main.rs

use std::collections::btree_map::BTreeMap;

use plotlib::style::BarChart;

fn main() {
    let message: &str = "This is a long message";
    let mut count = BTreeMap::new();

    for c in message.trim().to_lowercase().chars() {
        if c.is_alphabetic() {
            *count.entry(c).or_insert(0) += 1
        }
    }

    println!("Number of occurences per character");
    for (ch, count) in &count {
        println!("{:?}: {}", ch, count);
        let count = *count as f64;
        plotlib::barchart::BarChart::new(count).label(ch.to_string());
    }
    let v = plotlib::view::CategoricalView::new();   
    plotlib::page::Page::single(&v)
        .save("barchart.svg")
        .expect("saving svg");
}

Я ожидал, что эта программа выдаст SVG с данными в нем, но вызовет основную панику

Number of occurences per character
'a': 2
'e': 2
'g': 2
'h': 1
'i': 2
'l': 1
'm': 1
'n': 1
'o': 1
's': 4
't': 1
thread 'main' panicked at 'saving svg: ErrorMessage { msg: "invalid y_range: Range { lower: inf, upper: -inf }" }', src/libcore/result.rs:997:5
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

1 Ответ

1 голос
/ 08 июня 2019

Ваш просмотр пуст. Таким образом, нечего строить, и границы SVG находятся в исходном недопустимом состоянии.

Вы должны добавить BarChart к вашим CategoricalView и , а затем использовать это представление на странице, например:

let mut data = Vec::new();

for (ch, count) in &count {
    println!("{:?}: {}", ch, count);
    let count = *count as f64;
    data.push(plotlib::barchart::BarChart::new(count).label(ch.to_string()));
}

// Add data to the view
let v = data
    .iter()
    .fold(plotlib::view::CategoricalView::new(), |view, datum| {
        view.add(datum)
    });

plotlib::page::Page::single(&v)
    .save("barchart.svg")
    .expect("saving svg");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...