我只发现了类似于我想要的东西:
但是,我似乎无法将此应用于我的问题.我有一个带加权边的图,但权重不是唯一的(所以有15个边有权重1).我想根据它们的重量为我的边缘着色,重量越低,颜色越浅.
我尝试应用上述问题中建议的方法,但据我所知,这要求权重在每个边缘都是唯一的?
到目前为止,我已经按照不同边缘权重的升序生成了一个列表,并希望使用它来对可能的边缘颜色进行分类.我试图避免按重量绘制边缘,因为我可能需要绘制一个非常大的图形,边缘上有很大的权重范围.
如果不清楚,请在评论中告诉我,我会提供更具体的信息.
谢谢!
编辑:def draw_graph(目标):nlist = [目标] + G.邻居(目标)H = nx.subgraph(G,nlist)n = H.number_of_edges()颜色=范围(n)标签,权重= colour_and_label_edges(H )
pos = nx.spring_layout(H)
nx.draw(H, pos, node_color='#A0CBE2',edge_color=colours, node_size=100, edge_cmap=plt.cm.Blues, width=0.5, with_labels=False)
nx.draw_networkx_edge_labels(H, pos, edge_labels=labels)
plt.savefig("Graphs/edge_colormap_%s.png" % target) # save as png
plt.show() # display
pass
def colour_and_label_edges(graph):
d={}
for (u,v) in graph.edges():
d[u,v]=graph[u][v]['weight']
temp=[]
for val in d.values():
if val not in temp:
temp.append(val)
weights = sorted(temp,key=int)
return d, weights
Run Code Online (Sandbox Code Playgroud)
上面的代码是不完整的,但想法是函数给我一个权重列表,如下:
[1,2,3,4,5,6,9,10,16,21,47,89,124,134,224]
然后,我想使用此列表为每个重量分配颜色,重量越高颜色越深.(我在这个例子中使用了一个非常小的子图,相对于数据集).希望能稍微清理一下:S
我正在尝试实现一个宏以允许创建 MATLAB 风格的矩阵。我有一个基本的工作宏,但我还有很长的路要走。
我希望能够强制执行正确的结构(每行中的元素数量相同),但我不确定如何在宏中执行此操作。我想我想强制每个内部重复具有相同的长度 - 这是我可以做的吗?
到目前为止,这是我的代码:
pub struct Matrix<T> {
pub cols: usize,
pub rows: usize,
pub data: Vec<T>
}
macro_rules! mat {
( $($( $x:expr ),*);* ) => {
{
let mut vec = Vec::new();
let mut rows = 0;
$(
$(
vec.push($x);
)*
rows += 1;
)*
Matrix { cols : vec.len()/rows, rows: rows, data: vec}
}
};
}
Run Code Online (Sandbox Code Playgroud)
它有效,但正如您所见,它不是很安全。它对结构没有限制。
我想用这个宏做更多的事情,但我认为这是一个好的开始!
更新:
这是我制定的蹩脚实现的一些操场代码。如果有人有更好的建议,请告诉我!否则我会自己关闭它。
我目前正在开发一个简单的项目来让自己熟悉 Rust。我没有太多系统编程经验,但我希望学习!
我正在尝试创建一个矩阵结构,但我发现很难弄清楚应该如何存储数据。我觉得我应该能够使用数组。矩阵的大小必须在构造时定义,因此我希望可以将数组存储在堆栈上。
现在我的代码如下所示:
use std::ops::Mul;
use std::ops::Add;
use std::ops::Div;
struct Matrix {
cols: i32,
rows: i32,
// Of course this doesn't work!
data: [f32; ..cols*rows]
}
// Below here are a bunch of stub methods.
impl Mul<f32> for Matrix {
type Output = Matrix;
fn mul(self, m: f32) -> Matrix {
return self;
}
}
impl Mul<Matrix> for Matrix {
type Output = Matrix;
fn mul(self, m: Matrix) -> Matrix {
// Will use Strassen algorithm if large, traditional …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个Matrix结构,并且我想覆盖Index运算符以让我拥有矩阵样式的索引。
例如:
let m = Matrix { ... DATA ... }
let entry = m[0,0]
Run Code Online (Sandbox Code Playgroud)
我的结构是这样的:
struct Matrix {
cols: usize,
rows: usize,
data: Vec<f32>
}
Run Code Online (Sandbox Code Playgroud)
我一直在研究Index trait,但我不知道如何使这项工作发挥作用?另外,我希望能够在每个维度等中获取范围。
我正在尝试编写一个函数来返回a的平均值Vector.我希望它与泛型类型一起工作,但我在实现它时遇到了一些困难.
extern crate num; // 0.2.0
use num::Zero;
use std::ops::{Add, Div};
pub struct Vector<T> {
pub size: usize,
pub data: Vec<T>,
}
impl<T: Copy + Zero + Add<T, Output = T>> Vector<T> {
pub fn sum(&self) -> T {
self.data.iter().fold(T::zero(), |sum, &val| sum + val)
}
}
impl<T: Copy + Zero + Add<T, Output = T> + Div<T, Output = T>> Vector<T> {
pub fn mean(&self) -> T {
let sum = self.sum();
sum / self.data.len()
}
} …Run Code Online (Sandbox Code Playgroud) 我刚开始和Kivy一起开始,这与我以前的习惯有所不同,如果我犯了愚蠢的错误,我道歉!
现在我正在尝试创建一个执行以下操作的应用程序:
到目前为止,我已经实现了第一次,第二次.
现在我的拖动效果不太好.如果我移动鼠标太快,它会取消移动方法(因为它不再接触).有没有更好的方法来产生拖动或者我只是提高刷新率(如果是这样的话?).
def on_touch_move(self, touch):
if self.collide_point(touch.x, touch.y):
self.pos=[touch.x-25, touch.y-25]
Run Code Online (Sandbox Code Playgroud)
我尝试使用Buttons,使用on_press方法更好地跟踪移动.但是现在我很难更新按钮的位置(主要是语法).
class GraphNode(Button):
background_disabled_down=1
background_disabled_normal=1
def moveNode(self):
with touch:
self.pos=[touch.x-25, touch.y-25]
Run Code Online (Sandbox Code Playgroud)
我不知道如何使用触摸值,并不断收到一系列错误.(显然目前的尝试不起作用,我只是觉得这很有趣).
你可能会说,我也不知道如何摆脱按钮图形,因为我想使用椭圆.如果有人可以告诉我如何在按钮上更改椭圆的颜色,这将是一个额外的好处,这将是很酷的!
kv文件:
<GraphNode>:
size: 50, 50
canvas:
Ellipse:
pos: self.pos
size: self.size
on_press:
root.moveNode()
Run Code Online (Sandbox Code Playgroud)
我希望能够使用触摸信息更新位置,但不知道如何在此处实现.
完整的核心python代码:
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.button import Button
from kivy.properties import NumericProperty, ReferenceListProperty,\
ObjectProperty
from kivy.graphics import Color, Ellipse, Line
class GraphInterface(Widget):
node = ObjectProperty(None)
class GraphApp(App):
def build(self):
node = GraphNode()
game …Run Code Online (Sandbox Code Playgroud) 这是我在此处发布的文章的继续:在Kivy中使用和移动小部件/按钮
我想在Kivy中的两个节点(椭圆)之间创建一条线,以便可以在移动节点时动态更新端点。这是我当前的混乱框架:
class GraphEdge(Widget):
def __init__(self, **kwargs):
super(GraphEdge, self).__init__(**kwargs)
with self.canvas:
Line(points=[100, 100, 200, 100, 100, 200], width=1)
pass
Run Code Online (Sandbox Code Playgroud)
我只是为这些点输入了一些占位符值,因为我不确定如何开始使用App中其他小部件的值。
我的最终目标是能够选择两个节点,然后单击一个按钮以添加行(甚至更干净的行)。我并不是要有人为我制作这个,只是一些正确方向的指针会很棒:)。
链接中提供了更多信息,但如果需要,我很乐意在此处提供更多信息。
谢谢。
编辑:
附加信息:
我想根据一些事件来更新线的位置。例如,如果将椭圆移动到直线上,则希望最接近的边缘捕捉到椭圆并跟随它。
def snap_to_node(self, node):
if self.collide_widget(node):
print "collision detected"
self.line.points=[node.pos]
Run Code Online (Sandbox Code Playgroud)
(这只是一个很糟糕的尝试,我知道它根本不起作用。)最终目标是能够将“节点”与“边缘”连接起来。
编辑2:
所以我取得了一些进展。我创建了一个在时钟时间表中调用的更新方法:
def update(self, dt):
# detect node collision
self.edge.snap_to_node(self.node)
def snap_to_node(self, node):
if self.collide_widget(node):
print "collision detected"
self.line.points+=node.pos
Run Code Online (Sandbox Code Playgroud)
现在,我要使其仅更新一个点集(其想法是将其中一个线段捕捉到节点)。
到目前为止,此代码仅检测直线上某一点上的集合。另外,这些点不会检测到碰撞。
我正在尝试使用num crate Floattrait在我的库中实现泛型,但是我一直坚持与编译器作战。这有效:
struct Vector<T> {
data: Vec<T>,
}
trait Metric<T> {
fn norm(&self) -> T;
}
impl Metric<f32> for Vector<f32> {
fn norm(&self) -> f32 {
let mut s = 0.0;
for u in &self.data {
s = s + u * u;
}
s.sqrt()
}
}
Run Code Online (Sandbox Code Playgroud)
但这不是:
use num::Float; // 0.2.0
struct Vector<T> {
data: Vec<T>,
}
trait Metric<T> {
fn norm(&self) -> T;
}
impl<T: Float> Metric<T> for Vector<T> {
fn norm(&self) -> T …Run Code Online (Sandbox Code Playgroud) 因为我觉得它可能是可能的,所以我试图摆脱光滑的衬垫.
我将把我的代码放在下面,然后尝试解释一下我想要实现的更多内容.
for (int p = 0; p < 2; p++)
{
foreach (string player in players[p])
{
if (PlayerSkills[player].streak_count *>* 0) //This line
PlayerSkills[player].streak_count++;
else
PlayerSkills[player].streak_count = 0;
}
}
Run Code Online (Sandbox Code Playgroud)
*(p == 0?>:<)根据p选择比较运算符.
当然,我写的是垃圾.但基本上我想在p == 0时使用> 0,在p >> 0时使用<0.有没有一个很好的方法来实现这一目标?
我正试图让我的头围绕Rust,我正面临一个可能明显的错误.
我找到了一个计算两个向量的点积的方法,我想实现它,这样我就不需要使用向量来实现它.现在它看起来如下:
pub fn dot(&u: Vec<f32>, &v: Vec<f32>) -> f32 {
let len = cmp::min(u.len(), v.len());
let mut xs = &u[..len];
let mut ys = &v[..len];
let mut s = 0.;
let (mut p0, mut p1, mut p2, mut p3, mut p4, mut p5, mut p6, mut p7) =
(0., 0., 0., 0., 0., 0., 0., 0.);
while xs.len() >= 8 {
p0 += xs[0] * ys[0];
p1 += xs[1] * ys[1];
p2 += xs[2] * ys[2];
p3 += xs[3] …Run Code Online (Sandbox Code Playgroud)