【问题标题】:Flowcharts (pie and vertical)流程图(饼图和垂直)
【发布时间】:2016-06-05 19:51:45
【问题描述】:

我已经在互联网上搜索了几天使用 html 和 css 制作流程图(饼图和垂直)的方法,但我没有找到任何东西。有人用 html 和 css 制作这些类型的图表吗?可以帮忙我?

最后我找到了一种方法来制作这个图表,但我希望这些值是在 servlet 端计算的值。对于垂直饼图正在工作,但对于饼图没有(不显示)。另外我希望比例在我的最大值 (("${sumC}")=2000),现在是 60。 谁能帮我解决这些问题? 非常感谢!

这是我的 servlet 代码:

public class ListaCumparaturi extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              response.setContentType("text/html;charset=UTF-8");


              try{
                    ...
                    request.setAttribute("sumG", sumG);
                    request.setAttribute("sumCa", sumCa);
                    request.setAttribute("sumP", sumP);
                    request.setAttribute("sumC", sumC); 

     }
               catch (Exception e2)
               {
                 e2.printStackTrace();
               }
               finally
               {
                 out.close();
               }
            }
}

这里是js代码:

     <form action= "listacumparaturi" method="get">     
                    <canvas width="1000" height="1000" id="myCanvas"></canvas>


                    var x=  "${sumC}" ; 
            var y= "${sumG}" ; var z= "${sumP}" ; var w=  "${sumCa}" ;   total = "${sumT}";


      var vertical = {
        Calorii: x,
        Grasimi: y,
        Proteine: z,
        Carbo: w
      };
      var data = Object.keys(vertical);


      var c = document.getElementById("myCanvas");
      var ctx = c.getContext("2d");
      ctx.fillStyle = "blue";


        total = "${sumT}";



      color = ['red', 'blue', 'yellow','green','black'];
      start = 0;

              for (var i = 0; i < data.length; i++) {

                ctx.fillRect((i * 60) + 50, 100, 10, -(vertical[data[i]]));
                ctx.font = "9px Arial";
                ctx.fillText(data[i], (i * 60) + 51, 112);
                ctx.fillText((700 * i), 30, ((20 * -i) + 100));

                ctx.beginPath();
                ctx.moveTo(600, 150);
                ctx.arc(600, 150, 150, start, start +
                  (Math.PI * 2 * (vertical[data[i]] / total)), false);
                ctx.lineTo(600, 150);
                ctx.fillStyle = color[i];
                ctx.fill();
                start += Math.PI * 2 * (vertical[data[i]] / total);


              }
    </script>
                    </form>   

【问题讨论】:

  • 如果你对 css3 没有问题,你可以使用thecodeplayer.com/walkthrough/css3-family-tree
  • 没有制作饼图或垂直图。我现在不知道如何修改该代码以获得我想要的:(
  • 您应该提供一些代码来查看您拥有的 HTML 以及到目前为止您尝试过的 CSS ...

标签: java html css servlets


【解决方案1】:

可以使用 HTML 和 CSS3 画布构建自定义图表。

我创建了一个示例 codepen URL 以供参考。

http://codepen.io/nagasai/pen/EyjJLy

您可以更新自己的数据并从那里构建开始图表

HTML:

Javascript:

      //sample data object

      var vertical = {
        a: 10,
        b: 20,
        c: 40
      };
      var data = Object.keys(vertical);

      total = 0;
      var c = document.getElementById("myCanvas");
      var ctx = c.getContext("2d");
      ctx.fillStyle = "blue";
      for (var i = 0; i < data.length; i++) {

        total = total + vertical[data[i]];

      }

      color = ['red', 'blue', 'yellow'];
      start = 0;

      for (var i = 0; i < data.length; i++) {

        ctx.fillRect((i * 60) + 50, 100, 10, -(vertical[data[i]]));
        ctx.font = "9px Arial";
        ctx.fillText(data[i], (i * 60) + 51, 112);
        ctx.fillText((20 * i), 30, ((20 * -i) + 100));

        ctx.beginPath();
        ctx.moveTo(600, 150);
        ctx.arc(600, 150, 150, start, start +
          (Math.PI * 2 * (vertical[data[i]] / total)), false);
        ctx.lineTo(600, 150);
        ctx.fillStyle = color[i];
        ctx.fill();
        start += Math.PI * 2 * (vertical[data[i]] / total);
      }

希望这对你有帮助:)

【讨论】:

  • 非常感谢它成功了!但是您知道如何将来自 servlet 的参数作为图表的输入传递。例如:(我想要来自 servlet 的值)。我试过这个: var vertical = { a: ("${sumC}"), b: ("${sumCa}"), c: ("${sumP}") };它适用于垂直但饼图不起作用(不显示任何内容)。您还知道我应该在哪里更改饼图的值吗?谢谢
  • 那么这应该是另一个问题:) ..粘贴你正在尝试的代码....我会检查并告诉你
  • 我已经用代码编辑了我的问题。另外我希望刻度有我的最大值((“${sumC}”))。目前我的规模停止在 60 并且应该是 (("${sumC}")=2000)
  • 这一步导致它在 60 处停止, ctx.fillText((20 * i), 30, ((20 * -i) + 100));将其替换为 ctx.fillText((700 * i), 30, ((20 * -i) + 100));步骤 700 和最大 2100
  • 成功了,但是饼图还是有问题:(