我正在尝试计算消息中的字母并将它们导出到图像中。
我已经成功地用这些字母创建了一个 BTreeMap
并计算了它们。我遇到的问题是使用 plotlib 将它们导出到 SVG。我愿意使用其他库,但我觉得我的问题是更多地使用库而不是库本身。
这是我的计数器代码
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.
最佳答案
您的 View 是空的。因此,没有什么可绘制的,SVG 的边界处于其初始无效状态。
您必须将 BarChart
添加到您的 CategoricalView
并然后在页面上使用该 View ,例如:
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");
关于rust - 使用 plotlib 创建 SVG 失败并显示 "invalid y_range",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56502350/