精华内容
下载资源
问答
  • 1.在绘图前我们需要为 ...3.这里我做了两个一样的,只是把代码稍微简写了一下。 4.然后将组件引入到我的root.js文件里面去。 5.在root.js文件中用components:加载这个组件。 6.然后在root文件里面加上刚刚引进

    1.在绘图前我们需要为 ECharts 准备一个具备高宽的 DOM 容器。


    2.引入ECharts文件。

    我这里是用的组件方式


    3.这里我做了两个一样的图,只是把代码稍微简写了一下。


    4.然后将组件引入到我的root.js文件里面去。


    5.在root.js文件中用components:加载这个组件。


    6.然后在root文件里面加上刚刚引进来的组件标签,在网页上显示就是这样。


    还有一些特效(比方说更换颜色。。。) 可以去参照官网上面慢慢学,慢慢加

    展开全文
  • 柱形图是被使用最多的图之中的一个,在写XCL-Charts这个Android图表库时,为它花费的时间相当多,不是由于有多难绘制,而是要在设计时怎样才干保证图基类能适应各种情况,能灵活满足足够多的需求,以及够简洁的接口...

             柱形图是被使用最多的图之中的一个,在写XCL-Charts这个Android图表库时,为它花费的时间相当多,不是由于有多难绘制,而是要在设计时怎样才干保证图基类能适应各种情况,能灵活满足足够多的需求,以及够简洁的接口,并要开放出足够多的绘制元素和參数供开发者定制,同一时候对各类柱形图独有的的特点要加以突出,再加上柱形图的选项本身相对于其他图来说也是相当多的,所以花了比較多的时间。结果嘛,至少我自己临时认为还算不错。

         这里我仅仅简单给大家介绍XCL-Charts图表库中柱图一个比較有意思的特点: 柱形图在使用同一数据源情况下,实现显示风格的灵活切换。


    首先介绍下数据源:

         XCL-Charts柱形图的数据源我将其定义的相当简单,就三大元素: 

     键值,数据序列,柱形颜色 

    BarData(String key,List<Double> dataSeries,Integer color) 


    其次,看看实现风格切换:

    我在图表库Demo中,举了以下这样一个样例, 对于传入的同一个数据源XCL-Charts支持在6种形式的柱形图风格间进行切换。   

      

      经过封装,在XCL-Charts中实现这个效果代码在相当少的:

    /**
     * Copyright 2014  XCL-Charts
     * 
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     * 
     *     http://www.apache.org/licenses/LICENSE-2.0
     * 
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     * 	
     * @Project XCL-Charts 
     * @Description Android图表基类库
     * @author XiongChuanLiang<br/>(xcl_168@aliyun.com)
     * @Copyright Copyright (c) 2014 XCL-Charts (www.xclcharts.com)
     * @license http://www.apache.org/licenses/  Apache v2 License
     * @version v0.1
     */
    package com.demo.xclcharts.view;
    
    import java.text.DecimalFormat;
    import java.util.LinkedList;
    import java.util.List;
    
    import org.xclcharts.chart.BarChart3D;
    import org.xclcharts.chart.BarChart;
    import org.xclcharts.chart.BarData;
    import org.xclcharts.chart.StackBarChart;
    import org.xclcharts.common.IFormatterDoubleCallBack;
    import org.xclcharts.common.IFormatterTextCallBack;
    import org.xclcharts.renderer.XEnum;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.util.Log;
    
    /**
     * @ClassName SpinnerBarChart01View
     * @Description  柱形图同数据源不同柱形图切换的样例
     * @author XiongChuanLiang<br/>(xcl_168@aliyun.com)
     */
    public class SpinnerBarChart01View extends GraphicalView {
    	
    	private String TAG = "SpinnerBarChart01View";
    	
    	private int mChartStyle = 0;
    	private int mOffsetHeight = 0;
    	private BarChart mChart = null;
    	//标签轴
    	private List<String> chartLabels = new LinkedList<String>();
    	private List<BarData> chartData = new LinkedList<BarData>();
    	
    	public SpinnerBarChart01View(Context context,int chartStyle,int offsetHeight) {
    		super(context);
    		// TODO Auto-generated constructor stub
    		
    		mChartStyle = chartStyle;
    		mOffsetHeight = offsetHeight;		
    		chartLabels();
    		chartDataSet();
    		chartRender();
    	}
    		
    	private void initChart(int chartStyle)
    	{
    		switch(chartStyle)
    		{
    		case 0: //竖向柱形图
    			mChart = new BarChart();
    			//图例
    			mChart.getLegend().setLeftLegend("百分比");			
    			break;
    		case 1:	//横向柱形图
    			mChart = new BarChart();
    			mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
    			break;
    		case 2:	//竖向3D柱形图
    			mChart = new BarChart3D();
    			break;
    		case 3:	//横向3D柱形图
    			mChart = new BarChart3D();
    			mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
    			break;
    		case 4:	//竖向堆叠柱形图 
    			mChart = new StackBarChart();
    			((StackBarChart) mChart).setTotalLabelVisible(false);
    			break;
    		case 5:	//横向堆叠柱形图
    			mChart = new StackBarChart();
    			mChart.setChartDirection(XEnum.Direction.HORIZONTAL);
    			((StackBarChart) mChart).setTotalLabelVisible(false);
    			break;			
    		}
    		
    		
    	}
    	
    	public void chartRender()
    	{
    		try {
    			
    			initChart(mChartStyle);
    			
    			//图所占范围大小
    			mChart.setChartRange(0.0f, mOffsetHeight, getScreenWidth(),getScreenHeight() - mOffsetHeight);
    		
    			if(mChart.isVerticalScreen())
    			{
    				mChart.setPadding(5, 40, 10, 15);
    			}else{
    				mChart.setPadding(10, 45, 15, 15);
    			}
    				
    			//数据源
    			mChart.setDataSource(chartData);
    			mChart.setCategories(chartLabels);	
    									
    			//数据轴
    			mChart.getDataAxis().setAxisMax(100);
    			mChart.getDataAxis().setAxisMin(0);
    			mChart.getDataAxis().setAxisSteps(20);
    			
    			//定义数据轴标签显示格式
    			mChart.getDataAxis().setLabelFormatter(new IFormatterTextCallBack(){
    	
    				@Override
    				public String textFormatter(String value) {
    					// TODO Auto-generated method stub		
    					Double tmp = Double.parseDouble(value);
    					DecimalFormat df = new DecimalFormat("#0");
    					String label = df.format(tmp).toString();				
    					return label+"%";
    				}
    				
    			});		
    			//定义柱形上标签显示格式
    			mChart.getBar().setItemLabelVisible(true);
    			mChart.getBar().getItemLabelPaint().setColor((int)Color.rgb(72, 61, 139)); 
    			mChart.getBar().getItemLabelPaint().setFakeBoldText(true);
    			
    			mChart.setItemLabelFormatter(new IFormatterDoubleCallBack() {
    				@Override
    				public String doubleFormatter(Double value) {
    					// TODO Auto-generated method stub										
    					DecimalFormat df=new DecimalFormat("#0");
    					String label = df.format(value).toString();				
    					return label+"%";
    				}});	       
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			Log.e(TAG, e.toString());
    		}
    	}
    	private void chartDataSet()
    	{
    		//标签相应的柱形数据集
    		List<Double> dataSeriesA= new LinkedList<Double>();	
    		dataSeriesA.add(50d); 
    		dataSeriesA.add(25d);
    		dataSeriesA.add(20d);
    		BarData BarDataA = new BarData("Google",dataSeriesA,(int)Color.rgb(73, 135, 218));
    				
    		List<Double> dataSeriesB= new LinkedList<Double>();	
    		dataSeriesB.add(35d); 		
    		dataSeriesB.add(65d);
    		dataSeriesB.add(75d);
    		BarData BarDataB = new BarData("Baidu",dataSeriesB,(int)Color.rgb(224, 4, 0));
    		
    		List<Double> dataSeriesC= new LinkedList<Double>();	
    		dataSeriesC.add(15d);
    		dataSeriesC.add(10d);
    		dataSeriesC.add(5d);
    		BarData BarDataC = new BarData("Bing",dataSeriesC,(int)Color.rgb(255, 185, 0));
    		
    		chartData.add(BarDataA);
    		chartData.add(BarDataB);
    		chartData.add(BarDataC);
    	}
    	
    	private void chartLabels()
    	{
    		chartLabels.add("路人甲"); 
    		chartLabels.add("路人乙"); 
    		chartLabels.add("路人丙"); 
    	}	
    		
    	@Override
        public void render(Canvas canvas) {
            try{
            	mChart.render(canvas);
            } catch (Exception e){
            	Log.e(TAG, e.toString());
            }
        }
    }
    


        6种图各有各的特点,但在上面代码却能够看到,在XCL-Charts中使用柱形图是件很easy的事,甚至有没这样的感觉,传入数据轴和标签轴数据源的代码,比设置画图属性的代码很多其它? 当然代码少不代表效果阳春白雪。

         效果图例如以下:

           

          

            上面这些图仅仅是用最简单的方式展示了下柱形图风格的切换,这个样例并没有展示XCL-Charts灵活的定制性。而图表库在设计时,

    花时间最多的就是在其定制性上,由于我觉得图表库主要就是封装绘制图表时其本身的位置计算,逻辑处理等详细过程,而其他一切

    參数与绘制元素都应当是可供定制的。所以XCL-Charts中画图相关的各个元素和參数,差点儿都开放出来供用户定制,在这就不细说了。

             当然假设你留意下样例中的代码,也能够看出一部份特点来. 我把图中相关元素分别单立封装成了一个个类,如轴分为数据轴和标签轴,

    用于管理轴各自相关的一切属性。而柱形则归于bar这个类去处理。 而对于标签文字的显示等,则採用回调函数的方式开放出来,让用户自己定义格式,

    当然,不实现回调也没关系,会按默认的显示风格显示。 

            只是我也不是蛮干,啥都自定义,在有些地方能够看到,我开放了Canvas的Paint画笔对象出来,这样用户能够直接操控Android本身的画笔对象类,利用Android自己的函数和属性来定制效果,即够灵活,我也省事。嘿嘿.

    这个样例中显露的也仅仅是一点点功能而已,远不止这点功能。感兴趣的能够自己去下代码,看下我写的Demo。

           另外再提一句,XCL-Charts是利用Android Canvas相关的函数来绘制图表,相比于调用Web的各类js图表库来说,是具有原生优势的。假设有

    图表需求的,能够来尝试尝试。

           XCL-Charts是开源的,基于Apache v2 License开源协议

            开源中国收录的项目地址:
             http://www.oschina.net/p/xcl-charts

           代码分别托管在开源中国和GitHub上:
        开源中国上的代码托管地址:
               https://git.oschina.net/xclcharts/XCL-Charts

            GitHub上的代码托管地址:
               https://github.com/xcltapestry/XCL-Charts

            对这个库感兴趣的能够关注下。

     

           还有就是我前几天才公布的这个图表库,仅仅在CSDN自己博客发了篇通知和EOE论坛上发了个,没想到关注的人蛮多的,还有网友留言支持。真没想到,在这谢谢了。

           个人觉得,Android图表事实上是个非常小众的功能需求,当时折腾仅仅是纯兴趣。假设有留意我前段时间的博文就知道,当时事实上仅仅是学Canvas时觉得好玩,尝试实现了下在上面绘制各种图,没想到折腾出来的这东东整理整理还算有点用。

           特别是要谢谢开源中国,其代码托管速度蛮快的,另外收录的也非常快,我看了下,在"Android UI 组件"类别下的第4页就能找到了,在https://git.oschina.net/explore也上了推荐。

        当然眼下要完好的东东还有非常多, 总之有人关注就有了继续弄的动力,哈哈。


           MAIL: xcl_168@aliyun.com

           Blog:http://blog.csdn.net/xcl168


          


    转载于:https://www.cnblogs.com/yxwkf/p/3997059.html

    展开全文
  • 怎样用Python绘制?》一文中带大家了解了柱状,今天我们再来讲讲直方。作者:屈希峰,资深Python工程师,知乎多个专栏作者来源:华章科技01 概述直方(Histogram),形状类似柱状却有着与柱状完全不同的含义...

    导读:直方图和柱状图都是数据分析中非常常见、常用的图表,由于两者外观上看起来非常相似,也就难免造成一些混淆。此前我们曾在《柱状图、堆叠柱状图、瀑布图有什么区别?怎样用Python绘制?》一文中带大家了解了柱状图,今天我们再来讲讲直方图。

    作者:屈希峰,资深Python工程师,知乎多个专栏作者

    来源:华章科技

    01 概述

    直方图(Histogram),形状类似柱状图却有着与柱状图完全不同的含义。直方图牵涉统计学概念,

    首先要对数据进行分组,然后统计每个分组内数据元的数量。

    在平面直角坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,这样的统计图称为频数分布直方图。

    频数分布直方图需要经过频数乘以组距的计算过程才能得出每个分组的数量,同一个直方图的组距是一个固定不变的值,所以如果直接用纵轴表示数量,每个矩形的高代表对应的数据元数量,既能保持分布状态不变,又能直观地看出每个分组的数量,如图2-58所示。

    ▲图2-58 直方图

    通过直方图还可以观察和估计哪些数据比较集中,异常或者孤立的数据分布在何处。

    首先,了解如下几个基本概念。

    组数:

    在统计数据时,我们把数据按照不同的范围分成几个组,分成的组的个数称为组数。

    组距:

    每一组两个端点的差。

    频数:

    分组内数据元的数量除以组距。

    02 实例

    直方图代码示例如下所示。

    代码示例 2-45

    1plot = figure(plot_width=300, plot_height=300)

    2plot.quad(top=[2, 3, 4], bottom=[1, 2, 3], left=[1, 2, 3],

    3          right=[1.2, 2.5, 3.7], color="#B3DE69")

    4show(plot)

    运行结果如图2-59所示。

    ▲图2-59 代码示例2-45运行结果

    代码示例2-45第2行使用quad ()方法通过定义矩形的四边边界绘制直方图,具体参数说明如下。

    p .quad(left, right, top, bottom, **kwargs)参数说明。

    left

    (:class:`~bokeh.core.properties.NumberSpec` ) : 直方x轴左侧边界

    right

    (:class:`~bokeh.core.properties.NumberSpec` ) : 直方x轴右侧边界

    top

    (:class:`~bokeh.core.properties.NumberSpec` ) : 直方y轴顶部边界

    bottom

    (:class:`~bokeh.core.properties.NumberSpec` ) : 直方y轴底部边界

    其他参数(**kwargs)说明。

    alpha

    (float) : 一次性设置所有线条的透明度

    color

    (Color) : 一次性设置所有线条的颜色

    source

    (ColumnDataSource) : Bokeh特有数据格式(类似于Pandas Dataframe)

    legend

    (str) : 图元的图例

    x_range_name

    (str) : x轴范围名称

    y_range_name

    (str) : y轴范围名称

    level

    (Enum) : 图元渲染级别

    代码示例 2-46

    1import numpy as np

    2import scipy.special

    3from bokeh.layouts import gridplot

    4# 绘图函数

    5def make_plot(title, hist, edges, x, pdf, cdf):

    6    p = figure(title=title, tools='', background_fill_color="#fafafa")

    7    p.quad(top=hist, bottom=0, left=edges[:-1], right=edges[1:],

    8           fill_color="navy", line_color="white", alpha=0.5)

    9    p.line(x, pdf, line_color="#ff8888", line_width=4, alpha=0.7, legend="PDF")

    10    p.line(x, cdf, line_color="orange", line_width=2, alpha=0.7, legend="CDF")

    11

    12    p.y_range.start = 0

    13    p.legend.location = "center_right"

    14    p.legend.background_fill_color = "#fefefe"

    15    p.xaxis.axis_label = 'x'

    16    p.yaxis.axis_label = 'Pr(x)'

    17    p.grid.grid_line_color="white"

    18    return p

    19# 正态分布

    20mu, sigma = 0, 0.5

    21measured = np.random.normal(mu, sigma, 1000)

    22hist, edges = np.histogram(measured, density=True, bins=50)

    23x = np.linspace(-2, 2, 1000)

    24# 拟合曲线

    25pdf = 1/(sigma * np.sqrt(2*np.pi)) * np.exp(-(x-mu)**2 / (2*sigma**2))

    26cdf = (1+scipy.special.erf((x-mu)/np.sqrt(2*sigma**2)))/2

    27p1 = make_plot("Normal Distribution (μ=0, σ=0.5)", hist, edges, x, pdf, cdf)

    28# 对数正态分布

    29mu, sigma = 0, 0.5

    30measured = np.random.lognormal(mu, sigma, 1000)

    31hist, edges = np.histogram(measured, density=True, bins=50)

    32x = np.linspace(0.0001, 8.0, 1000)

    33pdf = 1/(x* sigma * np.sqrt(2*np.pi)) * np.exp(-(np.log(x)-mu)**2 / (2*sigma**2))

    34cdf = (1+scipy.special.erf((np.log(x)-mu)/(np.sqrt(2)*sigma)))/2

    35p2 = make_plot("Log Normal Distribution (μ=0, σ=0.5)", hist, edges, x, pdf, cdf)

    36# 伽玛分布

    37k, theta = 7.5, 1.0

    38measured = np.random.gamma(k, theta, 1000)

    39hist, edges = np.histogram(measured, density=True, bins=50)

    40x = np.linspace(0.0001, 20.0, 1000)

    41pdf = x**(k-1) * np.exp(-x/theta) / (theta**k * scipy.special.gamma(k))

    42cdf = scipy.special.gammainc(k, x/theta)

    43p3 = make_plot("Gamma Distribution (k=7.5, θ=1)", hist, edges, x, pdf, cdf)

    44# 韦伯分布

    45lam, k = 1, 1.25

    46measured = lam*(-np.log(np.random.uniform(0, 1, 1000)))**(1/k)

    47hist, edges = np.histogram(measured, density=True, bins=50)

    48x = np.linspace(0.0001, 8, 1000)

    49pdf = (k/lam)*(x/lam)**(k-1) * np.exp(-(x/lam)**k)

    50cdf = 1 - np.exp(-(x/lam)**k)

    51p4 = make_plot("Weibull Distribution (λ=1, k=1.25)", hist, edges, x, pdf, cdf)

    52# 显示

    53show(gridplot([p1,p2,p3,p4], ncols=2, plot_width=400, plot_height=400, toolbar_location=None))

    运行结果如图2-60所示。

    ▲图2-60 代码示例2-46运行结果

    代码示例2-46第5行自定义绘图函数make_plot (title, hist, edges, x, pdf, cdf),其中参数分别为图的标题、直方顶部边界、左右边界、拟合曲线的x坐标、方法通过定义矩形的四边边界,PDF为概率密度函数,CDF为累积分布函数。第53行通过gridplot()方法一次展示4张图(正态分布、对数正态分布、伽玛分布、韦伯分布)。

    关于作者:屈希峰,资深Python工程师,Bokeh领域的实践者和布道者,对Bokeh有深入的研究。擅长Flask、MongoDB、Sklearn等技术,实践经验丰富。知乎多个专栏(Python中文社区、Python程序员、大数据分析挖掘)作者,专栏累计关注用户十余万人。

    本文摘编自《Python数据可视化:基于Bokeh的可视化绘图》,经出版方授权发布。

    延伸阅读《Python数据可视化》

    推荐语:

    从图形绘制、数据动态展示、Web交互等维度全面讲解Bokeh功能和使用,不含复杂数据处理和算法,深入浅出,适合零基础入门,包含大量案例。

    展开全文
  • 先来梳理一下思路:通过上面的图片展示可以看出来,需要一个白色的背景+一个留有上下边距的矩形区域+顶部空白处的文本+底部空白处的文本+中间的柱形图(实际上是绘制的线,线的画笔给的宽了一点,你也可以采用绘制...

    这里写图片描述
      为什么要绘制柱状图?这是因为在有些应用中需要展示数据,单纯的列出一些数据估计谁看了都会烦,因此数据的展示通常会使用一些图表的形式展现出来。
      上面的柱子是怎样绘制的呢?先来梳理一下思路:通过上面的图片展示可以看出来,需要一个白色的背景+一个留有上下边距的矩形区域+顶部空白处的文本+底部空白处的文本+中间的柱形图(实际上是绘制的线,线的画笔给的宽了一点,你也可以采用绘制矩形的方式只是绘制矩形需要左上右下坐标,计算坐标比较麻烦,还是建议采用线条的形式),最后,为了让图表能够滑动,需要将整个自定义view放置到一个HorizontalScrollView上面去(这里为了以后管理的方便性,我创建了一个继承于HorizontalScrollView的class,将柱状图添加到其中放置)。
      PS:原谅我底部的“张三”的信息没有调试好位置

    相关文章

    [ Android 项目(一):自定义View绘制“折线图” ]
    可以先参考上面的博客,也可以直接看这篇文章,上面的博客由于绘制比较麻烦,我先写的准备工作,这篇博客由于绘制简单,就直接看如何绘制柱状图了。

    一、绘制柱状图

    柱状图的绘制直接看代码吧,思路就是上面介绍的。

    /**
     * Created by Administrator on 2015/10/12.
     */
    public class Histogromview extends View {
        //view 的宽与高
        private int width;
        private int heigh;
    
    
        //单个柱状图的间隔与宽度
        private int hisgrom_space;
        private int hisgrom_width;
    
        //柱状图上边距和下边距
        private int histogrom_topspa;
        private int histogrom_bottomspa;
    
        //矩形背景的画笔
        private Paint mpaint_bg;
    
       //单个柱子的背景
        private Paint mpaint_hisbg;
        //单个柱子的颜色
        private Paint mpaint_hiscolor;
        //文本的画笔
        private Paint mapint_text;
        private Paint.FontMetrics mMetrics;
    
       //总的数据个数 
        private int totaldata;
    
          //绘制图形时需要用到的数据,数据在MainActivity中添加,
          //Histogrom是Dao模式的数据
        private List<Histogrom> mdata=new ArrayList<>();
    
    
           //两个构造器
        public Histogromview(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context);
    
        }
    
    
    
        public Histogromview(Context context) {
            super(context);
    
        }
    
        //mdata的set/get方法
        public List<Histogrom> getMdata() {
            return mdata;
        }
    
        public void setMdata(List<Histogrom> mdata) {
            this.mdata = mdata;
            requestLayout();//相当于调用onMeasure方法
            invalidate();//相当于调用onDraw方法
        }
    
        private void init(Context context){
               //调用了一个dp转px的方法,网上有很多这样的方法
              histogrom_topspa=SizeConvert.dip2px(context,20);
              histogrom_bottomspa=SizeConvert.dip2px(context, 50);
              hisgrom_width=SizeConvert.dip2px(context, 10);
               hisgrom_space=SizeConvert.dip2px(context, 30);
    
              //画笔的背景颜色(灰色的背景)
              mpaint_bg=new Paint(Paint.ANTI_ALIAS_FLAG);
              mpaint_bg.setColor(Color.argb(0xff,0xef,0xef,0xef));
    
              //设置柱状图的背景颜色
              mpaint_hisbg=new Paint(Paint.ANTI_ALIAS_FLAG);
              mpaint_hisbg.setColor(Color.argb(0xff, 0xce, 0xcb, 0xce));
              mpaint_hisbg.setStrokeWidth(hisgrom_width);
    
              //设置柱状图的颜色
              mpaint_hiscolor=new Paint(Paint.ANTI_ALIAS_FLAG);
              mpaint_hiscolor.setColor(Color.RED);
              mpaint_hiscolor.setStrokeCap(Paint.Cap.ROUND);
              mpaint_hiscolor.setStrokeJoin(Paint.Join.ROUND);
              mpaint_hiscolor.setStrokeWidth(hisgrom_width);
    
              mapint_text=new Paint(Paint.ANTI_ALIAS_FLAG);
              mapint_text.setColor(Color.BLACK);
            //  mapint_text.setTextAlign(Paint.Align.CENTER);
              mMetrics=mapint_text.getFontMetrics();
          }
    
        public void setTotaldata(int totaldata) {
            this.totaldata = totaldata;
            invalidate();
        }
    
        public int getTotaldata() {
            return totaldata;
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            //画布的白色背景
            canvas.drawColor(Color.WHITE);
            //画布分灰色矩形区域,上下各自留出一定空白区域
            canvas.drawRect(0,heigh-histogrom_bottomspa,width,histogrom_topspa,mpaint_bg);
    
            //柱状图的绘制
            for(int i=0;i<totaldata;i++){
    
                //如果数据中没有数据就添加数据
                if(mdata==null){
                    Histogrom histogrom=new Histogrom("张三",0);
                    mdata.add(histogrom);
                }
    
                    //开始绘制
                    //绘制顶部百分数文本
                    String percent_str=mdata.get(i).getPercent()+"%";
                    canvas.drawText(percent_str, hisgrom_space * (i + 1),histogrom_topspa/2, mapint_text);
    
                    //绘制单个灰色柱子(总长度为100%)
                    canvas.drawLine(hisgrom_space * (i + 1),heigh - histogrom_bottomspa, hisgrom_space * (i + 1) ,histogrom_topspa , mpaint_hisbg);
    
                    //根据数据中的百分比绘制柱子高度
                    float dataheigh=mdata.get(i).getPercent();
                    canvas.drawLine(hisgrom_space * (i + 1), heigh - histogrom_bottomspa, hisgrom_space * (i + 1), heigh - histogrom_bottomspa - (heigh - histogrom_bottomspa - (histogrom_topspa + (mMetrics.descent - mMetrics.ascent))) * dataheigh / 100, mpaint_hiscolor);
    
                     //旋转画布,绘制底部文本
                    canvas.save();
                    canvas.rotate(-45, (hisgrom_space + hisgrom_width) * (i + 1) ,  heigh - histogrom_bottomspa );
                    String name_str=mdata.get(i).getName();
                    canvas.drawText(name_str,(hisgrom_space + hisgrom_width) * (i + 1)-histogrom_topspa-mapint_text.measureText(name_str), heigh - histogrom_bottomspa, mapint_text);
                    canvas.restore();
    
    
            }
    
        }
        private ViewGroup findHorizontalScrollView(View view) {
            ViewGroup parent = (ViewGroup) view.getParent();
            if(parent instanceof HorizontalScrollView) return parent;
            else return findHorizontalScrollView(parent);
        }
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            ViewGroup horizontalScrollView = findHorizontalScrollView(this);
            if(mdata.size()==0){
            //这里是一个获的父布局宽度的方法,自定义view的
                width=horizontalScrollView.getMeasuredWidth();
                   // width=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
            }
          else{
               //根据数据的多少确定绘制的宽度
                width=(hisgrom_space+hisgrom_width)*(mdata.size()+1);
            }
    
            heigh=getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
            setMeasuredDimension(width,heigh);
    
        }
    }
    

    二、自定义View继承HorizontalScrollView

    这个自定义view主要是用来添加柱状图的,也可以直接将自定义view添加到一个HorizontalScrollView 中。

    自定义view的xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
    <widget.chart.Histogromview
        android:id="@+id/histogromview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></widget.chart.Histogromview>
    </LinearLayout>

    自定义的HorizontalScrollview

    /**
     * Created by Administrator on 2015/10/12.
     */
    public class Scrollhistogrom extends HorizontalScrollView {
    
        private int width;
        private int heigh;
    
    
        public Scrollhistogrom(Context context) {
            super(context);
        }
    
        public Scrollhistogrom(Context context, AttributeSet attrs) {
            super(context, attrs);
            //添加自定义的柱状图,绘制的柱状图直接放在一个布局中
            LayoutInflater inflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
            View view=inflater.inflate(R.layout.activity_histogromview,null);
    
            addView(view);
         //   View.inflate(context, R.layout.activity_histogromview,this);
    
    //        View v=LayoutInflater.from(context).inflate(R.layout.activity_histogromview,this,false);
    //        addView(v);
    
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
    
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            width=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
            heigh=getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
    
            setMeasuredDimension(width, heigh);
        }
    }
    

    使用自定义的HorizontalScrollView

    xml

      <LinearLayout
                android:id="@+id/activity_report_chart_histogrom"
                android:layout_width="match_parent"
                android:layout_height="100dp"
                android:visibility="gone">
                <widget.chart.Scrollhistogrom
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    >
                </widget.chart.Scrollhistogrom>
            </LinearLayout>

    MainActivity中调用布局,设置数据

    public class MainActivity extends BaseActivity {
    
        private Histogromview histogromview;
        private List<Histogrom> data=new ArrayList<>();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mbtn= (Button) findViewById(R.id.btn);
    
            histogromview= (Histogromview) findViewById(R.id.histogromview);
            //设置总的数据条数
            histogromview.setTotaldata(20);
            //添加数据
            for (int i=0;i<histogromview.getTotaldata();i++){
                Histogrom histogrom=new Histogrom("张三",20);
                data.add(histogrom);
            }
            //将数据传给自定义view的data
            histogromview.setMdata(data);
    }
            }
    

    Dao模式类

    属性+属性的set/get方法+带有属性参数的构造器

    package dao;
    
    /**
     * Created by Administrator on 2015/10/13.
     */
    public class Histogrom {
        private String name;
        private int percent;
    
        public Histogrom(String name, int percent) {
            this.name = name;
            this.percent = percent;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getPercent() {
            return percent;
        }
    
        public void setPercent(int percent) {
            this.percent = percent;
        }
    }
    
    展开全文
  • 建议大家使用word时遇到问题按F1搜索帮助)使用直方图显示数据全部显示利用分析工具库的直方图工具,您可以分析数据并将其显示在直方图(显示频率数据的柱形图)中。安装MicrosoftOfficeExcel2007后此数据分析加载项(加...
  • 本次图形绘制非常简单,主要学习怎样绘制一个本金随年利率逐年变化的柱形图,程序需要输入本金和利率,然后生成10年内本金变化的图形,以下是程序代码: from graphics import* def main(): print("这是一个显示...
  • 在数据分析的时候,很多人习惯使用matlab做为分析工具,matlab自带有强大的数据分析处理能力,有方便和强大的GUI绘图插件可以方便的绘制波形图、散点图、柱形图等,另外也有FFT、小波分析、神经网络等插件,给声发射...
  • 6.7.2 绘制比较形式的堆积柱形图 6.7.3 应用立方体和人员图像突出营业额和人员计划 6.7.4 利用表格、箭头绘制混合图表体现净收入统计情况 6.7.5 强调某一产品出口额及出口增长率的混合图表 6.7.6 强调对比情况的混合...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 图像...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 185 4.3 ...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换...
  • 实例113 波形绘制 166 4.2 图形转换 168 实例114 BMP转换成JPG格式 168 实例115 JPG转换成BMP格式 170 实例116 位图转化为WMF 171 实例117 Ico文件转化为位图 172 实例118 图片批量转换工具 173 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 ...
  • 实例121 波形绘制 179 4.2 图形转换 180 实例122 BMP转换成JPG格式 181 实例123 JPG转换成BMP格式 182 实例124 位图转化为WMF格式 183 实例125 ICO文件转化为位图 184 实例126 图片批量转换工具 ...
  •  实例113 波形绘制 166  4.2 图形转换 168  实例114 BMP转换成JPG格式 168  实例115 JPG转换成BMP格式 170  实例116 位图转化为WMF 171  实例117 Ico文件转化为位图 172  实例118 图片批量...
  • C#.net_经典编程例子400个

    热门讨论 2013-05-17 09:25:30
    165 实例113 波形绘制 166 4.2 图形转换 168 实例114 BMP转换成JPG格式 168 实例115 JPG转换成BMP格式 170 实例116 位图转化为WMF 171 实例117 Ico文件转化为位图 172 实例118...

空空如也

空空如也

1 2
收藏数 35
精华内容 14
关键字:

怎样绘制柱形图