精华内容
下载资源
问答
  • 主要介绍了php使用Jpgraph创建柱状图展示年度收支表效果,结合完整实例形式分析了Jpgraph创建柱状图的具体步骤与操作技巧,需要的朋友可以参考下
  • Java创建柱状图及饼状图

    千次阅读 2018-11-12 22:05:07
    Java创建柱状图及饼状图

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                           

    Java创建图表其实还是很方便的,但是要引入相关的jar包。如下

    • jfreechart.jar
    • jcommon,jar
    • gnujaxp.jar
      其中最主要的是jfreechart.jar。
      下面就让我们先看看创建的图标的运行结果吧。
      饼状图
      柱状图
      是不是感觉很生动形象,一目了然呢?

    下面让我们一一拉进行分析吧首先是柱状图
    我已经在代码中做好了注释,可以直接拿过来使用。

    package mytest;import java.awt.FlowLayout;import java.awt.Font;import java.io.File;import java.io.IOException;import javax.swing.JFrame;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.chart.axis.CategoryAxis;import org.jfree.chart.axis.ValueAxis;import org.jfree.chart.plot.CategoryPlot;import org.jfree.chart.plot.PlotOrientation;import org.jfree.data.category.CategoryDataset;import org.jfree.data.category.DefaultCategoryDataset;import org.jfree.data.general.Dataset;public class BarChartDemo {    private ChartPanel panel;    /**     * 在柱状图中创建表格的步骤如下: 1、创建表格chart,需要注意相关参数的含义, 2、传进去的数据集是CategoryDataset格式     * 3、获得表格区域块,设置横轴,纵轴及相关字体(防止出现乱卡的状况)     * 4、设置chart的图例legend,并设置条目的字体格式(同样是为了防止出现乱码)     */    public BarChartDemo() {        CategoryDataset dataset = (CategoryDataset) getDataset();        JFreeChart chart = ChartFactory.createBarChart3D("学历信息统计", "横坐标",                "纵坐标", dataset, PlotOrientation.VERTICAL, true, false, false);        CategoryPlot plot = (CategoryPlot) chart.getCategoryPlot();        CategoryAxis axis = plot.getDomainAxis();        axis.setLabelFont(new Font("宋体", Font.BOLD, 20));        axis.setTickLabelFont(new Font("宋体", Font.BOLD, 20));        ValueAxis rangeAxis = plot.getRangeAxis();        rangeAxis.setLabelFont(new Font("宋体", Font.BOLD, 20));        chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 20));        chart.getTitle().setFont(new Font("黑体", Font.ITALIC, 22));        panel = new ChartPanel(chart, true);        //下面是王章偶然看到的生成图表图片的方法                File dir = new File("F:\\MyPicture\\");                   if (!dir.exists()) {                      dir.mkdir()                }                  String fName = String.valueOf(System.currentTimeMillis())+"BarChart.png"                File file = new File("F:\\MyPicture\\", fName)                try {                    ChartUtilities.saveChartAsPNG(file, chart, 400, 250);                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }//生成一个png图片     }    public ChartPanel getChartPanel() {        return panel;    }    /**     * 需要注意的是在向数据集中添加数据的时候 使用的是dataset.addValue()方法,而在饼状图的数据集添加数据的过程中,使用的是dataset.setValue()方法     * 这一点应该尤其注意。以免出错!     * @return     */    private static Dataset getDataset() {        DefaultCategoryDataset dataset = new DefaultCategoryDataset();        dataset.addValue(1, "郭1", "大学");        dataset.addValue(2, "郭2", "高中");        dataset.addValue(3, "郭3", "高中");        dataset.addValue(4, "郭4", "高中");        dataset.addValue(5, "郭5", "初中");        dataset.addValue(5, "郭6", "初中");        dataset.addValue(4, "郭7", "初中");        dataset.addValue(3, "郭8", "小学");        dataset.addValue(2, "郭9", "幼儿园");        dataset.addValue(1, "张10", "幼儿园");        return dataset;    }    public static void main(String[] args) {        JFrame frame = new JFrame();        frame.setLayout(new FlowLayout());        frame.add(new BarChartDemo().getChartPanel());        frame.setSize(1000, 600);        frame.setDefaultCloseOperation(0);        frame.setLocationRelativeTo(null);        frame.setVisible(true);    }}
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100

    然后是饼状图,里面的注释也是很到位的进行了解释

    package mytest;import java.awt.FlowLayout;import java.awt.Font;import java.io.File;import java.io.IOException;import java.text.DecimalFormat;import java.text.NumberFormat;import javax.swing.JFrame;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartPanel;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import org.jfree.chart.labels.StandardPieSectionLabelGenerator;import org.jfree.chart.plot.PiePlot;import org.jfree.data.general.DefaultPieDataset;public class PieChartDemo {    ChartPanel panel;    /**     * 创建饼状图的步骤如下: 1、创建一个饼状的实例,注意传参的格式,还有需要注意的是此时的数据集应该是defaultPieDataset,     * 而不是CategoryDataset格式 2、获得饼状图的所在区域 3、设置两个格式化的数据格式,为后面的床架饼状图的实例做基础     * 4、细节方面是对无数据、零值、负值等情况的处理 5、最后就是设置在出现汉字的地方进行字体内容的设置了(同样的,这是为了防止出现乱码的状况)     */    public PieChartDemo() {        DefaultPieDataset dataset = getDataset();        JFreeChart chart = ChartFactory.createPieChart3D("学校占比情况", dataset,                true, false, false);        PiePlot piePlot = (PiePlot) chart.getPlot();        DecimalFormat df = new DecimalFormat("0.00%");        NumberFormat nf = NumberFormat.getInstance();        StandardPieSectionLabelGenerator generator = new StandardPieSectionLabelGenerator(                "{0} {2}",                   //获得StandardPieSectionLabelGenerator对象,生成的格式,{0}表示section名,                //{1}表示section的值,{2}表示百分比。可以自定义                   nf, df);        piePlot.setLabelGenerator(generator);// 设置百分比        piePlot.setLabelFont(new Font("黑体", Font.ITALIC, 20));        // 当饼状图内额米有数据时,作如下数据中设置        piePlot.setNoDataMessage("此时并没有任何数据可用");        piePlot.setCircular(false);        piePlot.setLabelGap(0.02D);        piePlot.setIgnoreNullValues(true);// 设置不显示空位        piePlot.setIgnoreZeroValues(true);// 设置不显示负值或零值        panel = new ChartPanel(chart, true);        chart.getTitle().setFont(new Font("宋体", Font.BOLD, 18));        chart.getLegend().setItemFont(new Font("宋体", Font.BOLD, 20));        //下面是王章偶然看到的生成图表图片的方法        File dir = new File("F:\\MyPicture\\");           if (!dir.exists()) {              dir.mkdir();          }          String fName = String.valueOf(System.currentTimeMillis())+"pie.png";          File file = new File("F:\\MyPicture\\", fName);          try {            ChartUtilities.saveChartAsPNG(file, chart, 400, 250);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }//生成一个png图片      }    /**     * 需要注意的是在向数据集中添加数据的时候调用的是dataset.setvalue()方法,而不是柱状图中的addValue()方法     * 这一点应该尤其注意一下,以免在使用的时候出现错误     * @return     */    private DefaultPieDataset getDataset() {        DefaultPieDataset dataset = new DefaultPieDataset();        dataset.setValue("郭1", 1);        dataset.setValue("郭2", 2);        dataset.setValue("郭3", 3);        dataset.setValue("郭4", 4);        dataset.setValue("郭5", 3);        dataset.setValue("郭6", 2);        dataset.setValue("郭7", 1);        return dataset;    }    public ChartPanel getPieChartPanel() {        return panel;    }    public static void main(String[] args) {        JFrame frame = new JFrame();        frame.setLayout(new FlowLayout());        frame.add(new PieChartDemo().getPieChartPanel());        frame.setSize(1000, 700);        frame.setVisible(true);    }}
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104

    这里并没有创建折线图,大致的步骤和这两种图的创建相当。详细链接


    总结:
    java创建图表来对数据进行分析,使得数据的展示形式更加生动,具体。
    这里我还得到了一个知识点,那就是利用相关方法,来实现对这种图集的生成操作,只需指定号生成图像的保存路径及保存名称即可实现。如下

    //下面是王章偶然看到的生成图表图片的方法        File dir = new File("F:\\MyPicture\\");           if (!dir.exists()) {              dir.mkdir();          }          String fName = String.valueOf(System.currentTimeMillis())+"pie.png";          File file = new File("F:\\MyPicture\\", fName);          try {            ChartUtilities.saveChartAsPNG(file, chart, 400, 250);        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }//生成一个png图片  
      
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    the end!

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • MFC 创建柱形图

    千次阅读 2014-03-20 18:39:27
    最近一段时间在测试一个传感器的值,想观察传感器的一些特性,但是每次都把数据接收完,放到Orange里面出来,感觉有点麻烦,还是不能直观的体会;...安装下面的步骤进行操作: 1. Add BarChart.cpp and BarCh

    最近一段时间在测试一个传感器的值,想观察传感器的一些特性,但是每次都把数据接收完,放到Orange里面出来,感觉有点麻烦,还是不能直观的体会;后来就决定自己写一个程序,显示事实的数据;后来百度了一会,发现一个好玩的东西CBarChart;


    貌似很不错,这个已经被别人做好了,我们可以直接下载源代码:http://www.codeproject.com/Articles/17105/CBarChart

    然后使用里面的类进行操作!安装下面的步骤进行操作:

    1. Add BarChart.cpp and BarChart.h to your project.
    2. Add #include "BarChart.h" to the top of header file of class in which you want to add this chart.
    3. Add a membrt variable of type CBarChart.
    4. In your cpp file, use the Create method of the member variable to create a chart control.

    具体里面说的太清了,我这里就不多提了!我只给大家说下如何改一些参数;

    决定这个太宽了,如何把柱形图的宽度调窄一点?

    这个我找了半天,后来才发现原来控制宽度的是一个宏定义,在BarChart.h里面;


    不过我们也可以通过一个函数来设置,因为控制宽度那个m_nLineWidth作为BarChart的私有变量;所以只能在里面添加一个函数;或者把那个变量改为共有变量即可;

    更加详细还是看官网上,说的太详细了!我不得不佩服原作者!!!

    http://www.codeproject.com/Articles/17105/CBarChart

    不过,我想要的是折线图,或者是曲线图,但是他这个不行,后来我用CDC作图解决了!如果有需要的可以在这里留言,看是否有必要再写一篇blog!因为我觉得CDC不是什么难的!


    希望大家多多指教!

    展开全文
  • Python数据可视化:如何创建柱状图

    千次阅读 2020-08-14 16:55:57
    一图胜千言,使用Python的matplotlib库,可以快速创建高质量的图形...本文主题是如何用Matplotlib创建柱状图。 import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.style.use("ggplot") 1.

    一图胜千言,使用Python的matplotlib库,可以快速创建高质量的图形。

    我们团队推出一个新的系列教程:Python数据可视化,针对初级和中级用户,将理论和示例代码相结合,分别使用matplotlib, seaborn, plotly等工具实现可视化。

    本文主题是如何用Matplotlib创建柱状图。

    import numpy as np
    import matplotlib.pyplot as plt
    
    %matplotlib inline
    
    plt.style.use("ggplot")
    

    1. 基础柱状图

    柱状图(bar chart): 用长方形(柱子)的长度表示数值的统计图表,又称为条形图。柱状图常用来对比两个以上的数值,适用于较小的数据集。

    Matplotlib创建柱状图的接口: b a r ( x , h e i g h t , w i d t h , b o t t o m , a l i g n , c o l o r ) bar(x, height, width, bottom, align, color) bar(x,height,width,bottom,align,color)

    • x: 柱子的x轴坐标
    • height: 柱子高度,y轴坐标
    • width: 柱子宽度,默认0.8
    • bottom: 柱子底部的y轴坐标,默认为0
    • align: 柱子与x轴坐标的对齐方式,默认’center’
    • color: 柱子颜色
    • orientation: 柱子方向,‘horizontal’ or ‘vertical’

    bar()默认创建垂直柱状图,barh()可创建水平柱状图,原理基本一致。

    # 虚拟数据
    x = ["A", "B", "C", "D", "E", "F", "G", "H"]
    y = [150, 85.2, 65.2, 85, 45, 120, 51, 64]
    
    # 柱状图和散点图不同,散点图的(x,y)均为数值变量
    # 柱状图的x轴显示分类变量,有两种处理方式
    # 方式1:自己创建x轴坐标,并提供对应的标签
    # 方式2:让Matplotlib自动完成映射
    
    # 方式1
    # xticks = np.arange(len(x))  # 每根柱子的x轴坐标
    # xlabels = x  # 每根柱子的标签
    # fig, ax = plt.subplots(figsize=(10, 7))
    # ax.bar(x=xticks, height=y, tick_label=xlabels)
    
    # 方式2(推荐)
    fig, ax = plt.subplots(figsize=(10, 7))
    ax.bar(x=x, height=y)
    ax.set_title("Simple Bar Plot", fontsize=15)
    

    在这里插入图片描述

    2. 调整样式

    Matplotlib创建图表的优势在于,用户可以定制每一个细节,接下来调整柱状图的样式,包括改变柱子的宽度,对齐方式和颜色,以及如何把数值添加到图表中。

    x = ["A", "B", "C", "D", "E", "F", "G", "H"]
    y = [150, 85.2, 65.2, 85, 45, 120, 51, 64]
    
    fig, ax = plt.subplots(figsize=(10, 7))
    ax.bar(
        x=x,  # Matplotlib自动将非数值变量转化为x轴坐标
        height=y,  # 柱子高度,y轴坐标
        width=0.6,  # 柱子宽度,默认0.8,两根柱子中心的距离默认为1.0
        align="center",  # 柱子的对齐方式,'center' or 'edge'
        color="grey",  # 柱子颜色
        edgecolor="red",  # 柱子边框的颜色
        linewidth=2.0  # 柱子边框线的大小
    )
    ax.set_title("Adjust Styles of Bar plot", fontsize=15)
    
    # 一个常见的场景是:每根柱子上方添加数值标签
    # 步骤:
    # 1. 准备要添加的标签和坐标
    # 2. 调用ax.annotate()将文本添加到图表
    # 3. 调整样式,例如标签大小,颜色和对齐方式
    xticks = ax.get_xticks()
    for i in range(len(y)):
        xy = (xticks[i], y[i] * 1.03)
        s = str(y[i])
        ax.annotate(
            s=s,  # 要添加的文本
            xy=xy,  # 将文本添加到哪个位置
            fontsize=12,  # 标签大小
            color="blue",  # 标签颜色
            ha="center",  # 水平对齐
            va="baseline"  # 垂直对齐
        )
    

    在这里插入图片描述

    3. 堆积柱状图

    有时候想在同一根柱子上显示两个不同的数值,即所谓堆积柱状图(stacked bar chart)。

    假设一个场景,有6家门店,每家门店都销售三种产品,用堆积柱状图显示每家门店三种产品的销量。

    shops = ["A", "B", "C", "D", "E", "F"]
    sales_product_1 = [100, 85, 56, 42, 72, 15]
    sales_product_2 = [50, 120, 65, 85, 25, 55]
    sales_product_3 = [20, 35, 45, 27, 55, 65]
    
    fig, ax = plt.subplots(figsize=(10, 7))
    # 先创建一根柱子,显示第一种产品的销量
    ax.bar(shops, sales_product_1, color="red", label="Product_1")
    # 第二根柱子“堆积”在第一根柱子上方,通过'bottom'调整,显示第二种产品的销量
    ax.bar(shops, sales_product_2, color="blue", bottom=sales_product_1, label="Product_2")
    # 第三根柱子“堆积”在第二根柱子上方,通过'bottom'调整,显示第三种产品的销量
    ax.bar(shops, sales_product_3, color="green", 
           bottom=np.array(sales_product_2) + np.array(sales_product_1), label="Product_3")
    
    ax.set_title("Stacked Bar plot", fontsize=15)
    ax.set_xlabel("Shops")
    ax.set_ylabel("Product Sales")
    ax.legend()
    

    在这里插入图片描述

    4. 分组柱状图

    分组柱状图的原理跟堆积柱状图类似,但柱子不再是堆叠在一起,而是在相同的X轴标签上分成几根更窄的柱子,这些柱子都属于同一个组。

    沿用上面的案例。

    shops = ["A", "B", "C", "D", "E", "F"]
    sales_product_1 = [100, 85, 56, 42, 72, 15]
    sales_product_2 = [50, 120, 65, 85, 25, 55]
    sales_product_3 = [20, 35, 45, 27, 55, 65]
    
    # 创建分组柱状图,需要自己控制x轴坐标
    xticks = np.arange(len(shops))
    
    fig, ax = plt.subplots(figsize=(10, 7))
    # 所有门店第一种产品的销量,注意控制柱子的宽度,这里选择0.25
    ax.bar(xticks, sales_product_1, width=0.25, label="Product_1", color="red")
    # 所有门店第二种产品的销量,通过微调x轴坐标来调整新增柱子的位置
    ax.bar(xticks + 0.25, sales_product_2, width=0.25, label="Product_2", color="blue")
    # 所有门店第三种产品的销量,继续微调x轴坐标调整新增柱子的位置
    ax.bar(xticks + 0.5, sales_product_3, width=0.25, label="Product_3", color="green")
    
    ax.set_title("Grouped Bar plot", fontsize=15)
    ax.set_xlabel("Shops")
    ax.set_ylabel("Product Sales")
    ax.legend()
    
    # 最后调整x轴标签的位置
    ax.set_xticks(xticks + 0.25)
    ax.set_xticklabels(shops)
    

    在这里插入图片描述如果喜欢我们的文章,记得点赞和收藏哦,我们每天都会为大家带来Python,数据科学和量化交易的精品内容。

    【关于我们】

    蜂鸟数据:国内领先的金融数据API提供商。

    蜂鸟数据团队由业界顶尖的数据工程师,数据科学家和宽客组成,我们正努力构建一个强大的金融数据库,并提供API接口,目标是令金融数据开源化和平民化。

    浏览并测试我们接口吧,目前覆盖股票,外汇,商品期货,数字货币和宏观经济领域,包括实时报价(tick)和历史数据(分钟),提供REST API和Websocket两种接入方式,能够满足金融分析师,量化交易和理财app的需求。

    需要金融数据?利用蜂鸟API将数据整合到您的应用

    如果您准备好了,请登录蜂鸟官网,注册免费获取API密钥,然后开始探索我们的金融数据库吧。

    展开全文
  • 紧跟在饼图之后,柱状图是另外一个流行的数据可视化工具。...图7-2 创建柱状图操作步骤按照以下步,骤创建Bar Chart类,它根据一个数据的数组创建柱状图,并能够自动定位并设置柱状图和图例的尺寸:1. ...

    紧跟在饼图之后,柱状图是另外一个流行的数据可视化工具。本节,我们将创建一个可配置的Bar Chart类,它接受一个数据元素的数组,并生成一个简单的柱状图。我们将复用上一节的数据结构来比较其结果。跟Pie Chart类似,柱状图也尽可能自动填满整个画布。

    804b776f06b5de1fcf21e40fbcde2d33.png图7-2 创建柱状图

    操作步骤

    按照以下步,骤创建Bar Chart类,它根据一个数据的数组创建柱状图,并能够自动定位并设置柱状图和图例的尺寸:1. 定义BarChart类的构造函数,来绘制柱状图:

    /* BarChart类的构造函数 */

    function BarChart(config){

    // 用户自定义属性

    this.canvas  = document.getElementById(config.canvasId);

    this.data  = config.data;

    this.color  = config.color;

    this.barWidth  = config.barWidth;

    this.gridLineIncrement  = config.gridLineIncrement;

    /*  把最大值调整为能被网格的增量整除的最大可能值,且小于请求的最大值 */

    this.maxValue  = config.maxValue  - Math.floor(config.maxValue  % this.gridLineIncrement);

    this.minValue  = config.minValue;

    //常量定义

    this.font  = "12pt Calibri";

    this.axisColor  = "#555";

    this.gridColor  = "#aaa";

    this.padding  =  10;

    //关系定义

    this.context  = this.canvas.getContext("2d");

    this.range  = this.maxValue  - this.minValue;

    this.numGridLines  = this.numGridLines  = Math.round(this.range / this.gridLineIncrement);

    this.longestValueWidth  = this.getLongestValueWidth();

    this.x  = this.padding  + this.longestValueWidth;

    this.y  = this.padding  *  2;

    this.width  = this.canvas.width  -  (this.longestValueWidth  + this.padding  *  2);

    this.height  = this.canvas.height  -  (this.getLabelAreaHeight() + this.padding  *  4);

    //绘制柱状图

    this.drawGridlines();

    this.drawYAxis();

    this.drawXAxis();

    this.drawBars();

    this.drawYVAlues();

    this.drawXLabels();

    }

    2. 定义getLabelAreaHeight()方法,该方法决定标签区域的高度(标签位于x轴的下方):

    /* 通过找出标签的最大宽度,并用三角函数计算出其投影高度(因为标签文本会被旋转45°),来获取标签高度 */

    BarChart.prototype.getLabelAreaHeight  = function(){

    this.context.font  = this.font;

    var maxLabelWidth  =  0;

    /*

    * 遍历所有标签并确定哪个标签是最长的,使用该信息来决定标签的宽度

    */

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

    var label  = this.data[n].label;

    maxLabelWidth  = Math.max(maxLabelWidth, this.context. measureText(label).width);

    }

    /*返回 labelWidth 的 y 分量,labelWidth 在45°角的方向上

    *

    * a^2  + b^2  = c^2

    * a  = b

    * c  = labelWidth

    * a  = 直角三角形的高度分量

    * 解出a

    */

    return Math.round(maxLabelWidth  / Math.sqrt(2));

    };

    3. 定义getLongestValueWidth()方法,该方法返回最长的文本宽度:

    BarChart.prototype.getLongestValueWidth  = function(){

    this.context.font  = this.font;

    var longestValueWidth  =  0;

    for  (var n  =  0; n  <= this.numGridLines; n++)  {

    var value  = this.maxValue  -  (n  * this.gridLineIncrement);

    longestValueWidth  = Math.max(longestValueWidth, this.context.measureText(value).width);

    }

    return longestValueWidth;

    };

    4. 定义drawXLabels()方法,该方法绘制x轴标签:

    BarChart.prototype.drawXLabels  = function(){

    var context  = this.context;

    context.save();

    var data  = this.data;

    var barSpacing  = this.width  / data.length;

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

    var label  = data[n].label; context.save();

    context.translate(this.x  +  ((n  +  1  /  2)  * barSpacing), this.y  + this.height  +  10);

    context.rotate(-1  * Math.PI  /  4);  // 旋转45°

    context.font  = this.font;

    context.fillStyle  = "black";

    context.textAlign  = "right";

    context.textBaseline  = "middle";

    context.fillText(label,  0,  0);

    context.restore();

    }

    context.restore();

    };

    5. 定义drawYValues()方法,该方法绘制y轴的值:

    BarChart.prototype.drawYVAlues  = function(){

    var context  = this.context;

    context.save();

    context.font  = this.font;

    context.fillStyle  = "black";

    context.textAlign  = "right";

    context.textBaseline  = "middle";

    for  (var n  =  0; n  <= this.numGridLines; n++)  {

    var value  = this.maxValue  -  (n  * this.gridLineIncrement);

    var thisY  =  (n  * this.height  / this.numGridLines)  + this.y;

    context.fillText(value, this.x  -  5, thisY);

    }

    context.restore();

    };

    6. 定义drawBars()方法,该方法遍历所有数据元素,并为每个元素绘制一根柱子:

    BarChart.prototype.drawBars  = function(){

    var context  = this.context;

    context.save();

    var data  = this.data;

    var barSpacing  = this.width  / data.length;

    var unitHeight  = this.height  / this.range;

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

    var bar  = data[n];

    var barHeight  =  (data[n].value  - this.minValue)  * unitHeight;

    /* 如果柱子的高度小于0,意味着其值小于最小值。

    * 由于我们不想在x轴的下方绘制柱子,所以,只绘制高度大于0的柱子

    */

    if  (barHeight  >  0)  {

    context.save();

    context.translate(Math.round(this.x + ((n + 1 / 2) * barSpacing)), Math.round(this.y + this.height));

    /* 为了方便,我们可以绘制以x轴为起点、颠倒的柱子,

    * 然后使用scale(1,  -1)把它翻转到正确的方向。

    * 这是变换有助于减少计算的很好的例子

    */

    context.scale(1,  -1);

    context.beginPath();

    context.rect(-this.barWidth  /  2,  0, this.barWidth,

    barHeight);

    context.fillStyle  = this.color;

    context.fill();

    context.restore();

    }

    }

    context.restore();

    };

    7. 定义drawGridlines()方法,该方法绘制柱状图上的水平网格线:

    BarChart.prototype.drawGridlines  = function(){

    var context  = this.context;

    context.save();

    context.strokeStyle  = this.gridColor;

    context.lineWidth  =  2;

    // 绘制y轴网格线

    for  (var n  =  0; n  < this.numGridLines; n++)  {

    var y  =  (n  * this.height  / this.numGridLines)  + this.y;

    context.beginPath();

    context.moveTo(this.x, y);

    context.lineTo(this.x  + this.width, y);

    context.stroke();

    }

    context.restore();

    };

    8. 定义drawXAxis()方法,该方法绘制x轴:

    BarChart.prototype.drawXAxis  = function(){

    var context  = this.context;

    context.save();

    context.beginPath();

    context.moveTo(this.x, this.y  + this.height);

    context.lineTo(this.x  + this.width, this.y  + this.height);

    context.strokeStyle  = this.axisColor;

    context.lineWidth  =  2;

    context.stroke();

    context.restore();

    };

    9. 定义drawYAxis()方法,该方法绘制y轴:

    BarChart.prototype.drawYAxis  = function(){

    var context  = this.context;

    context.save();

    context.beginPath();

    context.moveTo(this.x, this.y);

    context.lineTo(this.x, this.height  + this.y);

    context.strokeStyle  = this.axisColor;

    context.lineWidth  =  2;

    context.stroke();

    context.restore();

    };

    10. 页面加载完成后,构建数据,并实例化一个BarChart对象:

    window.onload  = function(){

    var data  =  [{

    label: "Eating",

    value:  2

    },  {

    label: "Working",

    value:  8

    },  {

    label: "Sleeping",

    value:  8

    },  {

    label: "Errands",

    value:  2

    },  {

    label: "Entertainment",

    value:  4

    }];

    new BarChart({

    canvasId: "myCanvas",

    data: data,

    color: "blue",

    barWidth:  50,

    minValue:  0,

    maxValue:  10,

    gridLineIncrement:  2

    });

    };

    11. 在HTML文档的body部分嵌入canvas标签:

    工作原理

    与饼图相比,为了使柱状图变得真正通用,它需要多一点配置。实现BarChart类,我们需要传递画布ID、一个数据元素的数组、柱子颜色、柱子宽度、网格线的增量(网格线之间的单位的数目)、最大值和最小值。BarChart构造函数使用6个方法来渲染柱状图,它们分别是drawGridlines(),drawYAxis(),drawXAxis(),drawBars(),drawYValues(), drawXLabels()。

    BarChart类的关键是drawBars()方法,该方法迭代所有的数据元素,再针对每个数据元素,绘制一个矩形。绘制每个柱子的最简单方法是,先把上下文转换为垂直方向(以便正的y值是向上的,而不是向下的),把绘制光标定位到x轴,再绘制一个向下的矩形,矩形的高度等于数据元素的值。因为上下文在垂直方向上是颠倒的,于是,柱子就会向上直立。

    相关参考

    第1章 处理文本

    第2章 绘制矩形

    第4章 平移画布上下文

    第4章 旋转画布上下文

    第4章 创建镜像变换

    展开全文
  • 本文的主题是如何用Matplotlib创建柱状图。 import numpy as np import matplotlib.pyplot as plt %matplotlib inline plt.style.use("ggplot") 1. 基础柱状图 柱状图(bar chart): 用长方形
  • 步骤 在dialog中添加一个CATDlgFrame dialog对应的.cpp中添加: void ExportPrdMesCmd::BuildGraph() { //在此函数内添加下面内容 AddAnalyseNotificationCB(m_Dlg, m_Dlg->GetWindSizeNotification()...
  • 文章就讲解第一种图形,柱状图。1 基础绘制柱状图,我们主要用到bar()函数。只要将该函数理解透彻,我们就能绘制各种类型的柱状图。我们先看下bar()的构造函数:bar(x,height, width,*,align='center',**kwargs...
  • //生成柱状图 JFreeChart chart = ChartFactory.createBarChart ( "图书销售统计表", //图表标题 "图书", //目录轴的显示标签 "销量", //数值轴的显示标签 getDateSet(), //数据 //...
  • 今天使用python中的matplotlib库绘制3D柱形图,以下就是画图的完成代码。from mpl_toolkits.mplot3dimport Axes3Dimport matplotlib.pyplotas pltimport numpyas np#设置x轴取值xedges = np.array([10,20,30,40,50,...
  • ​在Excel中通过数据间的关系选择合适的图表,轻松创建折线图、柱状图、饼图使其表达的主题和内容更加简单清晰。 下面我们通过Smartbi大数据分析工具介绍excel分析图表制作方法,如何制作常用的图形折线图、柱状图、...
  • 安装echarts插件: ...接下来创建放置柱状图的容器: <div id='chart' style="width:100%;height:300px"></div> JS mounted方法中执行初始化echart的方法(这里我加了一个延时方法确保..
  • 在Excel 2010中的2个轴上创建折线柱形图 (Create a Line Column Chart on 2 Axes in Excel 2010)When you create a chart in Excel 2010, you can select a chart type on the Ribbon's Insert tab. 在Excel 2010中...
  • 创建一个完整柱形图的基本步骤: 1.定义数据 //定义数据 var dataset = [10, 20, 30, 40, 33, 24, 12, 5]; 2.创建svg画布 //在body中添加一个svg画布 var h = 400; var w = 400; var svg = d3.select("body") ....
  • Excel创建多个并列柱状图,并加次级坐标轴 步骤 选中原始数据,在【图表】中选择【更多图表】 在所有图表中,选择【组合图】。因为我选择了两列数据,因此有系列1和系列2。 两个系列都选择为【簇状柱形图】...
  • 在工作中我们经常会使用办公软件制作一些图形,下面我就教大家如何使用Excel 与Word 制作饼状图柱状图图形 方法/步骤首先我们先使用word制作出图形:启动wps word选择上面的插入——图表 ..在出现图表的对话框中选择...
  • 本节书摘来异步社区《Python数据可视化编程实战》...5.2 创建3D柱状图 Python数据可视化编程实战虽然matplotlib主要专注于绘图,并且主要是二维的图形,但是它也有一些不同的扩展,能让我们在地理图上绘图,让我们...
  • 如何创建双向双Y轴的柱形图

    千次阅读 2016-07-07 17:23:23
    1.原和目标   2.操作方法 步骤1:选中系列2,右击,“设置数据系列格式”,系列绘制在“次坐标轴”。如下:   步骤2:选择主坐标轴(左边),右击“设置坐标轴格式”,在坐标轴选项中选中“逆序刻度值”。...
  • 平面柱状图

    2014-03-17 11:22:00
    基于MFC工程柱状图 柱状图类(CMyBarChart)的两个文件(MyBarChart cpp MyBarChart h)不依赖于具体的工程 将文件添加至自己的工程即可运行 控件内柱子所在位置 大小 可根据控件大小自适应调整大小及位置 每根...
  • 新建一个html文件,将highcharts引入到你的页面后,通过两个步骤我们就可以创建一个简单的图表了。 1、创建div容器 在页面的 body部分创建一个div,并指定div 的 id,高度和宽度,代码如下 <div id=...
  • 5.2 创建3D柱状图Python数据可视化编程实战虽然matplotlib主要专注于绘图,并且主要是二维的图形,但是它也有一些不同的扩展,能让我们在地理图上绘图,让我们把Excel和3D图表结合起来。在matplot...
  • 其实很简单,下面小编为大家带来excel制作三维簇状柱形图的详细步骤教程,不懂的朋友可以根据下面的教程学习下。excel怎么制作三维簇状柱形图1、首先,打开一篇excel。2、按住ctrl键,选择你要...
  • 虽然matplotlib主要专注于绘图,并且主要是二维的图形,但是它也有一些不同的扩展,能让我们在地理上绘图,让我们把Excel和3D图表结合起来。在matplotlib的世界里,这些扩展叫做工具包(toolkits)。工具包是一些...
  • 本文主要讲述如何使用Python操作Excel绘制柱形图。开发工具,环境PyCharmPython3Office Excel前面我们已经创建好了一张Excel表。现在我们要根据已有的数据,往里面添加柱形图柱形图 BarChart参考《Python openpyxl...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,871
精华内容 2,748
关键字:

创建柱形图的步骤