如何在曲线图中计算针位置

时间:2016-04-28 16:00:12

标签: r plotly

我正在尝试使用R / Shiny中的plotly创建一个仪表图表,并且很难确定如何根据值确定针尖的(x,y)坐标。

我的仪表最小值= 18792,最大值= 29472,中点为24132.我使用以下代码计算(x,y)坐标:

extension String {

    var emojilessStringWithSubstitution: String {
        let emojiPatterns = [UnicodeScalar(0x1F600)...UnicodeScalar(0x1F64F),
                         UnicodeScalar(0x1F300)...UnicodeScalar(0x1F5FF),
                         UnicodeScalar(0x1F680)...UnicodeScalar(0x1F6FF),
                         UnicodeScalar(0x2600)...UnicodeScalar(0x26FF),
                         UnicodeScalar(0x2700)...UnicodeScalar(0x27BF),
                         UnicodeScalar(0xFE00)...UnicodeScalar(0xFE0F)]

        return self.unicodeScalars
            .map { ucScalar in
                emojiPatterns.contains{ $0 ~= ucScalar } ? UnicodeScalar(32) : ucScalar }
            .reduce("") { $0 + String($1) }
    }
}

我假设圆的原点是(0.5,0.5)。我需要针的长度为~0.2(所以r = 0.2)。

正如预期的那样,无论何时达到最小值(18792),针位置为(0.3,0.5),并且在屏幕上查看它看起来是正常的:

enter image description here

但是,当值达到中点(24132)时,虽然(x,y)按预期出现(0.5,0.7),但针似乎没有上一个例子那样长:

enter image description here

我使用的代码如下。您可以通过注释掉相应的县值来在min和mid之间切换:

x1 = round(0.5 + (0.2 * cos(deg2rad(180-degs))), digits = 3)
y1 = round(0.5 + (0.2* sin(deg2rad(180-degs))), digits = 3)

必须有一些我完全失踪的东西。非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

我知道这是事后的一点点,但我刚刚遇到了完全相同的问题,但使用的是Python API。我不需要我的语言绝对准确,而且“足够接近”会做。我通过将y轴上的半径值加倍来解决问题。

这产生了可接受的结果,我认为这是因为将x和y轴都视为0到1.0之间的值。我使用矩形显示面板,这意味着x = 0.1和y = 0.1是不同的度量。希望这有助于其他人!

答案 1 :(得分:0)

我想将甜甜圈图的标签放在其中,但我尝试了一种解决方案,但它不在我想要的位置。这是我们的代码:

p1 <- plot_ly(tab2, labels = ~c("Domicile-Travail","Domicile-ecole","Courses-achats","Utilisation professionnelle","Promenade-loisirs","Autre"), values = ~prop, type = 'pie',textposition = 'middle right',
         textinfo = 'percent',subtitle="B", hole= "0.5",domain = list(x = c(0, 0.45), y = c(0, 1)),insidetextfont = list(color = '#FFFFFF'),
         hoverinfo = 'text')

p2 <- plot_ly(tab3, labels= ~c("Domicile-Travail","Domicile-ecole","Courses-achats","Utilisation professionnelle","Promenade-loisirs","Autre"), values = ~prop, type = 'pie', textposition = 'middle left',
              textinfo = 'percent',hole= "0.5", domain = list(x = c(0.55,1), y = c(0, 1)), insidetextfont = list(color = '#FFFFFF'),
              hoverinfo = 'text', annotations=list(text="B",x=0,y=0,label=2013))

subplot(p1,p2)%>% 
  layout(title = "Nombre d'accidents par type de trajet ", 
         xaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE), 
         yaxis = list(showgrid = FALSE, zeroline = FALSE, showticklabels = FALSE))

答案 2 :(得分:0)

**对于 Python - 我有同样的问题,但只使用 Python

就我而言,这是因为半圆实际上并不是半圆。如果您使用

在图表后面绘制网格
fig.update_layout(xaxis={'showgrid': True, 'showticklabels':True})

您可能会发现沿 x 轴和 y 轴的半圆半径不相同。为了解决这个问题,我找到了另一个参数并添加了另一行:

fig.update_layout(autosize=False)

再次绘制网格以进行检查,但对我而言,这使我的仪表沿 x 和 y 轴具有相同的半径。然后,我的箭头/指示器始终保持相同的长度并准确指向。另一个潜在的技巧,如果你想让你的箭头不一直延伸到外边缘,你可以使用这个参数:

standoff=30 #try numbers to see what works

将此参数放在箭头注释中并使用一些值

@TWCars:您可以在图表的任何位置手动添加文本,如下所示:

fig.add_annotation(x=-.5, y=.5, text="<b>Text</b>", showarrow=False)

其中 x 和 y 值是文本将在网格上显示的位置(b 标记为粗体,可以删除)。这有点笨拙,但如果您的图形是静态的并且始终需要在一个位置显示文本,这可能是一个很好的解决方案。