2017-07-11 28 views
6

我正在绘制一些使用散景的几何图形,并且遇到了这个问题。我绘制了一个具有相等边(即一个正方形)的矩形,并在该正方形中绘制了一个直径=正方形宽度的圆。圆应该与边上的正方形相切,但不是。散景圈不适合广场?

这里是代码:

from bokeh.plotting import output_notebook, figure, show 
output_notebook() 

p = figure(width=500, height=500) 

p.rect(0, 0, 300, 300, line_color='black') 
p.circle(x=0, y=0, radius=150, line_color='black', 
     fill_color='grey', radius_units='data') 

p.axis.minor_tick_out = 0 

show(p) 

导致此:

enter image description here

有什么我做错了,或者可以换作圆配合正好在广场上?

由于提前, 兰德尔

这里的另一种情况下 - 只是绘制一个圆:

p = figure(width=500, height=500, x_range=(-150, 150), y_range=(-150, 150)) 
p.circle(x=0, y=0, radius=150, line_color='black', 
     fill_color='grey', radius_units='data') 
show(p) 

的圆的半径为150在x方向上,而不是y方向。

enter image description here

+0

如果'bokeh'一个圆圈是不是一个圈子,也许你应该检查是否这个问题记录在他们的github页面,如果没有,报告它 –

+0

好点。我把它发布在github上。希望有一些简单的事情我做错了。 发布的链接:https://github.com/bokeh/bokeh/issues/6603 –

+0

@RandallGoodwin嗨我在下面发布了一个答案,这对我来说非常合理,似乎不是一个问题。我想这取决于你期望'p.circle'做什么,我期望它创建散点图,所以上面的行为对我来说似乎是合理的。 – evan54

回答

0

不知道,但布鲁矩形不是你的矩形。

替换:

p.rect(0, 0, 300, 300, line_color='black') 

通过:

p.rect(-150, -150, 150, 150, line_color='black') 
+0

中的方面匹配的新答案这只是移动方块,使其居中在-150,-150。我又增加了一个测试 - 画一个半径为150的圆。这次没有矩形(或方形)。在x方向上,r = 150,但不在y方向上。 –

4

UPDATE:请注意由下@DuCorey新的答案。至于Bokeh 0.12.7,方面控制现在可用于这种情况。


问题是,实际上广场不是方形的,那是因为像素宽高比和“数据”宽高比不匹配。即,每个像素的距离在x方向上不同于y方向上的距离。

有几个选项:

  • 您可以使用各种属性来控制中央绘图区的尺寸(如情节边框的宽度和轴的刻度标签方向),您还可以控制你的数据范围明确。换句话说,你可以使长宽比匹配,然后圆和矩形将匹配

  • 您可以使用绝对像素单元(例如size了一圈,并用大square标记代替rect)而不是“数据”单位。

另外,如果你想有一个循环,“变形”的时候,各方面不匹配,那么你最好的选择是使用ellipse用相同的widthheight,这将在这种情况下,背景虚化,因为工作两个尺寸用于测量(而不是单个radius),并且可以独立地将每个尺寸与每个尺寸的尺度相匹配。

(这实际上是根本区别在于说明了其行为:rect有两个维度独立地测量circle确实,它只有一个,并具有任意使用x或y维度来测量每个像素的距离)

+0

谢谢@bigreddot。将尝试一些这些选项并回报:) –

0

好的,基于这些建议,我尝试了几件事情。

  • 改变y轴刻度标记的方向 - 仍然 有问题。
  • 更改了各种对应关系,即使在标记内的刻度线 中移动(具有负偏移量)。也没有工作。
  • 将figure()中的x_range和r_range更改为相等的元组。没有工作
  • 更改plot_height(减少它),我可以通过里亚尔和错误,最终通过plot_height得到圆适合在广场上,这是一个<绘图宽度。

很多伟大的练习控制剧情的属性。时间会投入。

但是,我尝试过的最后一次更改工作得最好。这是第一个建议之一 - 改变情节边界。

奇怪的是,设置为p.min_border=40,其中0.12.6是默认值,并且显示图表的图表纵横比,其中plot_width = plot_height在屏幕上也是真实的1。

p = figure(plot_width=500, plot_height=500) 

p.rect(0, 0, 300, 300, line_color=None) 

p.circle(x=0, y=0, radius=150, line_color=None, 
     fill_color='lightgrey', radius_units='data') 

p.min_border=40 

show(p) 

显示添加效果的图像前后p.min_border=40。任何超过〜33的值似乎足以强制绘图区域具有相同的屏幕x和y尺寸 - 所以方形实际上是一个正方形(并且内部的圆适合)。

enter image description here

enter image description here

0

这样做的原因是,你要创建一个圆形标记(或圆形字形),并将其放置在位置(0,0),而它好像要创建于0

为中心的圆我觉得这里rect“发生”的工作,因为它可以在两个维度上具有正确的尺度,并保持一个“矩形”。

Keyword Args: 
    radius (UnitsSpecPropertyDescriptor) : The radius values for circle markers (in "data space" units, by default). (default None) 
    radius_dimension (BasicPropertyDescriptor) : What dimension to measure circle radii along. (default 'x') 
    radius_units (Enum('screen', 'data')) : (default 'data') 

我想我的观点是在这里你试图使用“字形”作为您的情节,并指定单位是数据单元拍摄的快捷方式。

如果你想创建一个实际的圈子,你可以做到以下几点:

th = np.linspace(0, 2*np.pi) 

r = 150 

p = figure(width=500, height=500) 

p.rect(0, 0, 300, 300, line_color='black') 

p.line(r * np.cos(th), r * np.sin(th), line_color='black') 
# p.circle(x=0, y=0, radius=150, line_color='black', 
#   fill_color='grey', radius_units='data') 

p.axis.minor_tick_out = 0 

show(p) 

通知中的上述更难填补(我没有理会),因为我猜你需要定义一些关闭多边形函数,而我只定义了恰好是闭合多边形的一条线,在这种情况下是一个圆。

2

我想报告,从散景0.12.7开始,现在可以通过更简单的方式解决此问题。

正如其他帖子所述,主要问题不是圆圈不是圆,而是方形不是方形。这是由于Bokeh绘制图形(画布)的实际区域默认情况下通常不是正方形,或者即使宽度和高度设置为相同的值。默认情况下,散焦会尝试通过使用画布上的所有空间来绘制图形。这会导致图的距离与像素点之间的距离不匹配。

作为0.12.7,数字可以接受现在,当设置为True将将匹配数据空间的情节的像素空间的方面的match_aspect属性。

在你的榜样,只需在你的身材加上match_aspect = True

p = figure(width=500, height=500, match_aspect=True, 
      title="Circle touches all 4 sides of square") 
p.rect(0, 0, 300, 300, line_color='black') 
p.circle(x=0, y=0, radius=150, line_color='black', 
     fill_color='grey', radius_units='data') 

现在将产生

Circle touches all 4 sides of the square