当前位置: 移动技术网 > IT编程>开发语言>Java > java生成饼图svg及JFreeChart生成svg图表

java生成饼图svg及JFreeChart生成svg图表

2019年07月22日  | 移动技术网IT编程  | 我要评论

翟鸿深,躺着的爱情txt,邢台信息网

jfreechart本身不能生成svg图形,但是可以借助另外一个东西,辅助生成.好像是这个:batik ,具体代码请看下文

一:java生成svg饼图,附带了一个标签显示各个颜色代表的部分

package com.tellhow.svg;
import java.io.file;
import java.io.fileoutputstream;
/**
 * 
 * @author 风絮no.1
 *
 */
public class cakysvgwithlabel {
 //定义不同的颜色
 static string[] colors ={"#f2e692", "#aa1111", 
   "#799ae1", "#3e941b", 
   "#66cc00", "#297110", 
   "#d6a97b", "#82522b", 
   "#aaaaff", "#1111aa", 
   "#ff2222", "#ffaaaa"};
 static string initialize(double [] percents,string[]names){
 stringbuffer sfile = new stringbuffer();
 sfile.append("<?xml version='1.0' encoding='utf-8'?>");
 sfile.append("\n");
 sfile.append("<svg xmlns:svg='http://www.w3.org/2000/svg'");
 sfile.append("\n");
  sfile.append("xmlns='http://www.w3.org/2000/svg'");
  sfile.append("\n");
  sfile.append("xmlns:xlink='http://www.w3.org/1999/xlink'");
  sfile.append("\n");
  sfile.append("xml:space='default'");
  sfile.append("\n");
  sfile.append("version='1.1' width='100%' height='100%' viewbox='0 0 2024 570'>");
  sfile.append("\n");
  sfile.append("<defs></defs>");
  sfile.append("\n");
  sfile.append("<g stroke-width='1' stroke='#ffffff' transform='matrix(1,0,0,1,16.384,-9.83)' xmlns='http://www.w3.org/2000/svg'>");
  sfile.append("\n");
  //循环创造path标签.
  string path =creatpath(502, 300, 300, percents,names);//中心点式503,300.
  sfile.append(path);
  sfile.append("</g>");
  sfile.append("\n");
  sfile.append("</svg>");
 return sfile.tostring();
 }
 /**
 * 
 * @param x0 中心点横坐标
 * @param y0 中心点纵坐标
 * @param r 半径
 * @param percents 百分比数组
 * @param names 显示颜色代表的名称
 * @return
 */ 
 public static string creatpath(double x0,double y0,double r,double[]percents,string[]names){
  stringbuffer sfile =new stringbuffer();
  double x1=0; //新扇形的x坐标
  double y1=0; //新扇形的y坐标
  double middlex=0; //文本显示的坐标,包括竖线显示的坐标
  double middley=0;
  double radian =0; //弧度
  double textradian=0; //文本显示位置度弧度
  double k=0;
  int n=10;
  for(int i=0;i<percents.length;i++){
  if(i==0){
   radian =getradian(percents[0]);
   textradian=radian/2;
   x1 = (x0+getcos(radian)*r);
   y1 = (y0-getsin(radian)*r);
   middlex=(x0+getcos(textradian)*r);
   middley=(y0-getsin(textradian)*r);
   double percent = math.round(percents[0]*100)/100.0;//获得精确到两位小数点的坐标.
   k=math.abs((middley-y0)/(middlex-x0));//获得扇形终点的坐标,与中心点连成的直线的斜率.(取正值)
   double sita= math.atan(k);//求斜角
   double linelen=50;
   double textlen=70;
   if(radian<6){
   linelen=90;
   textlen=110;//控制指示线的长度,与文字的位置
   }
   if(percents[i]!=0){//当一个类型为0时,饼图展示
   if((textradian<(math.pi/2))){
    sfile.append("<line x1='"+middlex+"' y1='"+middley+"' x2='"+(middlex+math.cos(sita)*linelen)+"' y2='"+(middley-(math.sin(sita)*linelen))+"' stroke='#000000'/>");
    sfile.append("\n");
    sfile.append("<text x='"+(middlex+math.cos(sita)*textlen)+"' y='"+(middley-(math.sin(sita)*textlen))+"' space='preserve' font-family='tahoma' font-size='21' fill='red' stroke='red' baseline-shift='baseline' >"+percent+"%</text>");
   }else if ((textradian>(math.pi/2)&&textradian<math.pi)){
    sfile.append("<line x1='"+middlex+"' y1='"+middley+"' x2='"+(middlex-math.cos(sita)*linelen)+"' y2='"+(middley-(math.sin(sita)*linelen))+"' stroke='#000000'/>");
    sfile.append("\n");
    sfile.append("<text x='"+(middlex-math.cos(sita)*textlen)+"' y='"+(middley-(math.sin(sita)*textlen))+"' space='preserve' font-family='tahoma' font-size='21' fill='red' stroke='red' baseline-shift='baseline' >"+percent+"%</text>");
   }else if ((textradian>(math.pi)&&textradian<(math.pi*3/2))){
    sfile.append("<line x1='"+middlex+"' y1='"+middley+"' x2='"+(middlex-math.cos(sita)*linelen)+"' y2='"+(middley+(math.sin(sita)*linelen))+"' stroke='#000000'/>");
    sfile.append("\n");
    sfile.append("<text x='"+(middlex-math.cos(sita)*textlen)+"' y='"+(middley+(math.sin(sita)*textlen))+"' space='preserve' font-family='tahoma' font-size='21' fill='red' stroke='red' baseline-shift='baseline' >"+percent+"%</text>");
   }else if((textradian>(math.pi*3/2)&&textradian<(math.pi*2))){
    sfile.append("<line x1='"+middlex+"' y1='"+middley+"' x2='"+(middlex+math.cos(sita)*linelen)+"' y2='"+(middley+math.sin(sita)*linelen)+"' stroke='#000000'/>");
    sfile.append("\n");
    sfile.append("<text x='"+(middlex+math.cos(sita)*textlen)+"' y='"+(middley+(math.sin(sita)*textlen))+"' space='preserve' font-family='tahoma' font-size='21' fill='red' stroke='red' baseline-shift='baseline' >"+percent+"%</text>");
   }
   sfile.append("\n"); 
   if(getradian(percents[0])>math.pi){
   sfile.append("<path d='m "+x0+" "+y0+" l "+(x0+r)+" "+r+" a "+r+" "+r+" 0 1 0 "+x1+" "+y1+" l "+x0+" "+y0+" z' fill='"+colors[0]+"'/>");
   }else{
   sfile.append("<path d='m "+x0+" "+y0+" l "+(x0+r)+" "+r+" a "+r+" "+r+" 0 0 0 "+x1+" "+y1+" l "+x0+" "+y0+" z' fill='"+colors[0]+"'/>");
   }
   sfile.append("\n");
   }
   sfile.append("<rect x='"+(x0+2*r)+"' y='"+(y0-r/2.0+n)+"' width='60' height='30' fill='"+colors[i]+"' stroke='#ffffff' stroke-dasharray='1,1' />");
   sfile.append("\n"); 
   sfile.append("<text x='"+(x0+2*r+80)+"' y='"+(y0-r/2.0+n+25)+"' space='preserve' font-family='宋体' font-size='28' fill='"+colors[0]+"' stroke='#000000' stroke-dasharray='1,1' baseline-shift='baseline'>"+names[0]+"</text>");
   sfile.append("\n");
  }else{
  textradian = radian+(getradian(percents[i])/2);//获取指示线与x轴的弧度.
  radian =radian+getradian(percents[i]);//第i个扇形前面的弧度的总和
  middlex=(x0+getcos(textradian)*r);
   middley=(y0-getsin(textradian)*r);
   double percent = math.round(percents[i]*100)/100.0;
   k=math.abs((middley-y0)/(middlex-x0));
   double linelen=50;
   double textlen=70;
   if(radian<6){
   linelen=90;
   textlen=110;
   }
   double sita= math.atan(k);
   if(percents[i]!=0){//当一个类型为0时,饼图展示
   if((textradian<(math.pi/2))){
    sfile.append("<line x1='"+middlex+"' y1='"+middley+"' x2='"+(middlex+math.cos(sita)*linelen)+"' y2='"+(middley-(math.sin(sita)*linelen))+"' stroke='#000000'/>");
    sfile.append("\n");
    sfile.append("<text x='"+(middlex+math.cos(sita)*textlen)+"' y='"+(middley-(math.sin(sita)*textlen))+"' space='preserve' font-family='tahoma' font-size='21' fill='red' stroke='red' baseline-shift='baseline' >"+percent+"%</text>");
   }else if ((textradian>(math.pi/2)&&textradian<math.pi)){
    sfile.append("<line x1='"+middlex+"' y1='"+middley+"' x2='"+(middlex-math.cos(sita)*linelen)+"' y2='"+(middley-(math.sin(sita)*linelen))+"' stroke='#000000'/>");
    sfile.append("\n");
    sfile.append("<text x='"+(middlex-math.cos(sita)*textlen)+"' y='"+(middley-(math.sin(sita)*textlen))+"' space='preserve' font-family='tahoma' font-size='21' fill='red' stroke='red' baseline-shift='baseline' >"+percent+"%</text>");
   }else if ((textradian>(math.pi)&&textradian<(math.pi*3/2))){
    sfile.append("<line x1='"+middlex+"' y1='"+middley+"' x2='"+(middlex-math.cos(sita)*linelen)+"' y2='"+(middley+(math.sin(sita)*linelen))+"' stroke='#000000'/>");
    sfile.append("\n");
    sfile.append("<text x='"+(middlex-math.cos(sita)*textlen)+"' y='"+(middley+(math.sin(sita)*textlen))+"' space='preserve' font-family='tahoma' font-size='21' fill='red' stroke='red' baseline-shift='baseline' >"+percent+"%</text>");
   }else if((textradian>(math.pi*3/2)&&textradian<(math.pi*2))){
    sfile.append("<line x1='"+middlex+"' y1='"+middley+"' x2='"+(middlex+math.cos(sita)*linelen)+"' y2='"+(middley+math.sin(sita)*linelen)+"' stroke='#000000'/>");
    sfile.append("\n");
    sfile.append("<text x='"+(middlex+math.cos(sita)*textlen)+"' y='"+(middley+(math.sin(sita)*textlen))+"' space='preserve' font-family='tahoma' font-size='21' fill='red' stroke='red' baseline-shift='baseline' >"+percent+"%</text>");
   }
  sfile.append("\n");
  // 参数 1 表示 画大于180的弧, 0 表示画小于180的弧 (这个地方比较重要)
  if(getradian(percents[i])>math.pi){
   sfile.append("<path d='m "+x0+" "+y0+" l "+x1+" "+y1+" a "+r+" "+r+" 0 1 0 "+(x1=x0+getcos(radian)*r)+" "+(y1=y0-getsin(radian)*r)+" l "+x0+" "+y0+" z' fill='"+colors[i]+"'/>");
  }else{
    sfile.append("<path d='m "+x0+" "+y0+" l "+x1+" "+y1+" a "+r+" "+r+" 0 0 0 "+(x1=x0+getcos(radian)*r)+" "+(y1=y0-getsin(radian)*r)+" l "+x0+" "+y0+" z' fill='"+colors[i]+"'/>");
  }
  sfile.append("\n");
  }
  n+=50;
   sfile.append("<rect x='"+(x0+2*r)+"' y='"+(y0-r/2.0+n)+"' width='60' height='30' fill='"+colors[i]+"' stroke='#ffffff' stroke-dasharray='1,1' />");
   sfile.append("\n"); 
   sfile.append("<text x='"+(x0+2*r+80)+"' y='"+(y0-r/2.0+n+25)+"' space='preserve' font-family='宋体' font-size='28' fill='"+colors[0]+"' stroke='#000000' stroke-dasharray='1,1' baseline-shift='baseline'>"+names[i]+"</text>");
   sfile.append("\n");
  }
  }
  return sfile.tostring();
 }
 //返回弧度
 public static double getradian(double fenshu){
  return (fenshu*math.pi)/50;
 }
 //返回正弦
 public static double getsin(double radian){
 return math.sin(radian);
 }
 //返回余弦
 public static double getcos(double radian){
 return math.cos(radian);
 }
 public static void main(string[] args) {
 int[] data= {3,64,0,284,10};
 string[] names={"主变:"+data[0]+"个","断路器:"+data[1]+"个","线路:"+data[2]+"个","刀闸:"+data[3]+"个","母线:"+data[4]+"个"};
 create(data,names);
 }
 private static void create(int[] data,string[] names) {
 try {
 createsvg("d:/a.svg",getpercent(data),names);
 } catch (exception e) {
 e.printstacktrace();
 }
 }
 private static double[] getpercent(int data[]){
 double sum=0;
 double percents[] = new double[data.length];
 for(int i=0;i<data.length;i++){
 sum+=data[i];
 }
 for(int i=0;i<data.length;i++){
 percents[i] =(data[i]/sum)*100;
 }
 return percents;
 }
 public static void createsvg(string filerealpath, double[] percents,string[] names) throws exception {
 string sfile = initialize(percents,names);
 try {
 byte[] bytefil = sfile.getbytes("utf-8");
 file svgfile = new file(filerealpath);
 if (svgfile.exists()) {
 svgfile.delete();
 }
 fileoutputstream fos = new fileoutputstream(svgfile);
 fos.write(bytefil);
 fos.close();
 } catch (exception ex) {
 system.out.print(ex.getmessage());
 }
 }
}

二.java生成svg 3d饼图.

(这个可以生成图形,但是不完善,我没有再修改代码啦,因为觉得这个东西不值,用jfreechart可能更好.功能更强到,只是这几个程序,让我更加了解了svg这个东西,里面的一些标签都干什么用的.等等.) 3d的这个,生成的效果图,会有断层的效果,主要是出现在第一现象和第四象限,即如果第一象限或第四象限,有两个扇形的话,就会出现断层,可以用这个工具进行调整:svgdeveloper. 用它打开svg图形,然后将断层的扇形的代码,重新倒序排列一下.

package com.xj.svg; 
 
import java.io.file; 
import java.io.fileoutputstream; 
 
public class caky3dsvg { 
 static string[] colors ={"#d6a97b", 
        "#22ff22", "#aaffaa", "#799ae1", 
        "#9aabee", "#3e941b", "#f2e692", 
        "#66cc00", "#297110", "#d6a97b", 
        "#82522b", "#aaaaff", "#1111aa", 
        "#ff2222", "#ffaaaa", "#aa1111" 
        }; 
 public static void main(string[] args) { 
  double data[] = {20,20,50}; 
   try { 
   createsvg("f:/f.svg",getpercent(data)); 
   } catch (exception e) { 
    e.printstacktrace(); 
   } 
 } 
 static string initialize(double [] percent){ 
  double percents[] = {10,15,5,20,40,10}; 
  stringbuffer sfile = new stringbuffer(); 
  sfile.append("<?xml version='1.0' encoding='utf-8'?>"); 
  sfile.append("\n"); 
  sfile.append("<svg xmlns:svg='http://www.w3.org/2000/svg'"); 
  sfile.append("\n"); 
  sfile.append("xmlns='http://www.w3.org/2000/svg'"); 
  sfile.append("\n"); 
  sfile.append("xmlns:xlink='http://www.w3.org/1999/xlink'"); 
  sfile.append("\n"); 
  sfile.append("xml:space='default'"); 
  sfile.append("\n"); 
  sfile.append("version='1.1' width='100%' height='100%' viewbox='0 0 1024 600'>"); 
  sfile.append("\n"); 
  sfile.append("<defs></defs>"); 
  sfile.append("\n"); 
  string path = createpath(502, 300,300, 150, percents); 
  sfile.append(path); 
  sfile.append("</g>"); 
  sfile.append("\n"); 
  sfile.append("</svg>"); 
  return sfile.tostring(); 
 } 
 /** 
  * 
  * @param x0 原点 x 
  * @param y0 原点 y 
  * @param langr 
  * @param shortr 
  * @param fenshu 
  * @return 
  */ 
 static string createpath(double x0,double y0,double langr,double shortr ,double percents[]){ 
  stringbuffer sfile = new stringbuffer(); 
  double xbottom =0; 
  double ybottom =0; 
  double xbottom1=0; 
  double ybottom1=0; 
  double radian =0; 
  sfile.append("<g stroke-width='1' stroke='#000000' transform='matrix(1,0,0,1,1.638,-9.83)' xmlns='http://www.w3.org/2000/svg'>"); 
  sfile.append("\n"); 
  for(int i=0;i<percents.length;i++){ 
   system.out.println("i:"+i); 
   radian =radian+getradian(percents[i]);//第i个扇形到 第一个扇形,弧度的总和. 
   system.out.println("弧度2:"+radian); 
    if (i==0){ 
    system.out.println("弧度1:"+radian); 
    if(radian==math.pi/2){ 
     xbottom = x0;//底面的x坐标 
     ybottom = y0-shortr;//底面的y坐标 
    }else if(radian==math.pi*3/2){ 
     xbottom = x0;//底面的x坐标 
     ybottom = y0+shortr;//底面的y坐标 
    } else{ 
     double tanradian = math.abs(math.tan(radian)); 
     double sqvalue=shortr*shortr+tanradian*tanradian*langr*langr; 
     if(radian<math.pi/2){ 
      system.out.println("if1:"+radian); 
      xbottom = x0+(langr*shortr)/math.sqrt(sqvalue);//底面的x坐标 
      ybottom = y0-(tanradian*langr*shortr)/math.sqrt(sqvalue);//底面的y坐标 
     } 
     else if (radian>math.pi/2&&radian<=math.pi){ 
      system.out.println("if2:"+radian); 
      xbottom =x0-(langr*shortr)/math.sqrt(sqvalue); 
      ybottom =y0-(tanradian*langr*shortr)/math.sqrt(sqvalue); 
     }else if (radian>math.pi&&radian<math.pi*3/2){ 
      system.out.println("if3:"+radian); 
      xbottom =x0-(langr*shortr)/math.sqrt(sqvalue); 
      ybottom =y0+(tanradian*langr*shortr)/math.sqrt(sqvalue); 
     }else if (radian>math.pi*3/2&&radian<math.pi*2){ 
      system.out.println("if4:"+radian); 
      xbottom = x0+(langr*shortr)/math.sqrt(sqvalue); 
      ybottom = y0+(tanradian*langr*shortr)/math.sqrt(sqvalue); 
     } 
    } 
    if(getradian(percents[0])>math.pi){//大于 pi 弧度,即百分比超过50% 
     sfile.append("<g fill='"+colors[i]+"' >"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+x0+" "+y0+" l "+(x0+langr)+" "+y0+" a "+langr+" "+shortr+" 0 1 0 "+xbottom+" "+ybottom+" z' />"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+(x0+langr)+" "+(y0-50)+" a "+langr+" "+shortr+" 0 1 0 "+xbottom+" "+(ybottom-50)+" l "+xbottom+" "+ybottom+" a "+langr+" "+shortr+" 0 1 1 "+(x0+langr)+" "+y0+" z' />"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+x0+" "+(y0-50)+" l "+(x0+langr)+" "+(y0-50)+" a "+langr+" "+shortr+" 0 1 0 "+xbottom+" "+(ybottom-50)+" z' />"); 
     sfile.append("\n"); 
     sfile.append("</g>"); 
     sfile.append("\n"); 
    }else{ 
     sfile.append("<g fill='"+colors[i]+"' >"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+x0+" "+y0+" l "+(x0+langr)+" "+y0+" a "+langr+" "+shortr+" 0 0 0 "+xbottom+" "+ybottom+" z' />"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+(x0+langr)+" "+(y0-50)+" a "+langr+" "+shortr+" 0 0 0 "+xbottom+" "+(ybottom-50)+" l "+xbottom+" "+ybottom+" a "+langr+" "+shortr+" 0 0 1 "+(x0+langr)+" "+y0+" z' />"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+x0+" "+(y0-50)+" l "+(x0+langr)+" "+(y0-50)+" a "+langr+" "+shortr+" 0 0 0 "+xbottom+" "+(ybottom-50)+" z' />"); 
     sfile.append("\n"); 
     sfile.append("</g>"); 
     sfile.append("\n"); 
    } 
    }else{ 
    if(radian==math.pi/2){ 
     xbottom1= x0;//底面的x坐标 
     ybottom1= y0-shortr;//底面的y坐标 
    }else if(radian==math.pi*3/2){ 
     xbottom1 = x0;//底面的x坐标 
     ybottom1 = y0+shortr;//底面的y坐标 
    } else{ 
     double tanradian = math.abs(math.tan(radian)); 
     double sqvalue=shortr*shortr+tanradian*tanradian*langr*langr; 
     if(radian<math.pi/2){ 
      system.out.println("if1:"+radian); 
      xbottom1 = x0+(langr*shortr)/math.sqrt(sqvalue);//底面的x坐标 
      ybottom1 = y0-(tanradian*langr*shortr)/math.sqrt(sqvalue);//底面的y坐标 
     } 
     else if (radian>math.pi/2&&radian<=math.pi){ 
      system.out.println("if2:"+radian); 
      xbottom1 =x0-(langr*shortr)/math.sqrt(sqvalue); 
      ybottom1 =y0-(tanradian*langr*shortr)/math.sqrt(sqvalue); 
     }else if (radian>math.pi&&radian<math.pi*3/2){ 
      system.out.println("if3:"+radian); 
      xbottom1 =x0-(langr*shortr)/math.sqrt(sqvalue); 
      ybottom1 =y0+(tanradian*langr*shortr)/math.sqrt(sqvalue); 
     }else if (radian>math.pi*3/2){ 
      system.out.println("if4:"+radian); 
      xbottom1 = x0+(langr*shortr)/math.sqrt(sqvalue); 
      ybottom1 = y0+(tanradian*langr*shortr)/math.sqrt(sqvalue); 
     } 
    } 
    if(getradian(percents[i])>math.pi){//大于 pi 弧度,即百分比超过50% 
     system.out.println("大于pi"); 
     sfile.append("<g fill='"+colors[i]+"' >"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+x0+" "+y0+" l "+xbottom+" "+ybottom+" a "+langr+" "+shortr+" 0 1 0 "+xbottom1+" "+ybottom1+" z' />"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+(xbottom)+" "+(ybottom-50)+" a "+langr+" "+shortr+" 0 1 0 "+xbottom1+" "+(ybottom1-50)+" l "+xbottom1+" "+ybottom1+" a "+langr+" "+shortr+" 0 1 1 "+xbottom+" "+ybottom+" z' />"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+x0+" "+(y0-50)+" l "+(xbottom)+" "+(ybottom-50)+" a "+langr+" "+shortr+" 0 1 0 "+xbottom1+" "+(ybottom1-50)+" z' />"); 
     sfile.append("\n"); 
     sfile.append("</g>"); 
     sfile.append("\n"); 
    }else{ 
     system.out.println("小于pi"); 
     sfile.append("<g fill='"+colors[i]+"' >"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+x0+" "+y0+" l "+xbottom+" "+ybottom+" a "+langr+" "+shortr+" 0 0 0 "+xbottom1+" "+ybottom1+" z' />"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+(xbottom)+" "+(ybottom-50)+" a "+langr+" "+shortr+" 0 0 0 "+xbottom1+" "+(ybottom1-50)+" l "+xbottom1+" "+ybottom1+" a "+langr+" "+shortr+" 0 0 1 "+xbottom+" "+ybottom+" z' />"); 
     sfile.append("\n"); 
     sfile.append("<path d='m "+x0+" "+(y0-50)+" l "+(xbottom)+" "+(ybottom-50)+" a "+langr+" "+shortr+" 0 0 0 "+xbottom1+" "+(ybottom1-50)+" z' />"); 
     sfile.append("\n"); 
     sfile.append("</g>"); 
     sfile.append("\n"); 
    } 
    xbottom=xbottom1; 
    ybottom=ybottom1; 
    } 
  } 
  return sfile.tostring(); 
 } 
  //返回弧度 
 public static double getradian(double percent){ 
  return (percent*math.pi)/50; 
 } 
 //返回正弦 
 public static double getsin(double radian){ 
   return math.sin(radian); 
 } 
  
 //返回余弦 
 public static double getcos(double radian){ 
  return math.cos(radian); 
 } 
  
 private static double[] getpercent(double data[]){ 
  double sum=0; 
  double percents[] = new double[data.length]; 
  for(int i=0;i<data.length;i++){ 
    sum+=data[i]; 
  } 
  for(int i=0;i<data.length;i++){ 
   percents[i] =(data[i]/sum)*100; 
  } 
  return percents; 
 } 
 public static void createsvg(string filerealpath, double[] percents) throws exception { 
  string sfile = initialize(percents); 
  try { 
   byte[] bytefil = sfile.getbytes("utf-8"); 
   file svgfile = new file(filerealpath); 
   if (svgfile.exists()) { 
    svgfile.delete(); 
   } 
   fileoutputstream fos = new fileoutputstream(svgfile); 
   fos.write(bytefil); 
   fos.close(); 
  } catch (exception ex) { 
   system.out.print(ex.getmessage()); 
  } 
 } 
} 

三.使用jfreechart动态生成svg图形:

import java.awt.rectangle; 
import java.io.*; 
import org.jfree.chart.*; 
import org.apache.batik.dom.genericdomimplementation; 
import org.apache.batik.svggen.svggraphics2d; 
import org.jfree.data.category.categorydataset; 
import org.jfree.data.category.defaultcategorydataset; 
import org.jfree.chart.plot.*; 
import org.w3c.dom.domimplementation; 
import org.w3c.dom.document; 
/** 
 * 该类用于演示最简单的柱状图生成 
 */ 
public class barchartdemo { 
 public static void main(string[] args) throws ioexception { 
  categorydataset dataset = getdataset(); 
  // 创建jfreechart对象,在内存中间创建出对应的图像 
  jfreechart chart = chartfactory.createbarchart3d("水果产量图", // 图表标题 
    "水果", // 目录轴的显示标签 
    "产量", // 数值轴的显示标签 
    dataset, // 数据集 
    plotorientation.vertical, // 图表方向:水平、垂直 
    true, // 是否显示图例(对于简单的柱状图必须是false) 
    false, // 是否生成工具 
    false // 是否生成url链接 
    ); 
  file fo_svg = new file("d:\\fruit3.svg"); 
  rectangle bounds = new rectangle(0,0,400,300); 
  exportchartassvg(chart,bounds,fo_svg); 
 } 
 
 private static void exportchartasjpg() throws filenotfoundexception, ioexception { 
  // 得到数据dataset 
  categorydataset dataset = getdataset(); 
  // 创建jfreechart对象,在内存中间创建出对应的图像 
  jfreechart chart = chartfactory.createbarchart3d("水果产量图", // 图表标题 
    "水果", // 目录轴的显示标签 
    "产量", // 数值轴的显示标签 
    dataset, // 数据集 
    plotorientation.vertical, // 图表方向:水平、垂直 
    true, // 是否显示图例(对于简单的柱状图必须是false) 
    false, // 是否生成工具 
    false // 是否生成url链接 
    ); 
 
  fileoutputstream fos_jpg = null; 
  try { 
   fos_jpg = new fileoutputstream("d:/fruit3.jpg"); 
   chartutilities.writechartasjpeg(fos_jpg, 1, chart, 400, 300, null); 
  } finally { 
   try { 
    fos_jpg.close(); 
   } catch (exception e) { 
   } 
  } 
 } 
 
 /** 
  * 获取一个演示用的简单数据集对象 
  * 
  * @return 
  */ 
 private static categorydataset getdataset() { 
  defaultcategorydataset dataset = new defaultcategorydataset(); 
  dataset.addvalue(100, "1", "葡萄"); 
  dataset.addvalue(200, "1", "梨子"); 
  dataset.addvalue(200, "1", "荔枝"); 
  dataset.addvalue(300, "2", "葡萄"); 
  dataset.addvalue(400, "2", "梨子"); 
  dataset.addvalue(500, "2", "荔枝"); 
  return dataset; 
 } 
 
 /** 
  * 获取一个演示用的组合数据集对象 
  * 
  * @return 
  */ 
 private static categorydataset getdataset2() { 
  defaultcategorydataset dataset = new defaultcategorydataset(); 
  dataset.addvalue(100, "北京", "苹果"); 
  dataset.addvalue(100, "上海", "苹果"); 
  dataset.addvalue(100, "广州", "苹果"); 
  dataset.addvalue(200, "北京", "梨子"); 
  dataset.addvalue(200, "上海", "梨子"); 
  dataset.addvalue(200, "广州", "梨子"); 
  dataset.addvalue(300, "北京", "葡萄"); 
  dataset.addvalue(300, "上海", "葡萄"); 
  dataset.addvalue(300, "广州", "葡萄"); 
  dataset.addvalue(400, "北京", "香蕉"); 
  dataset.addvalue(400, "上海", "香蕉"); 
  dataset.addvalue(400, "广州", "香蕉"); 
  dataset.addvalue(500, "北京", "荔枝"); 
  dataset.addvalue(500, "上海", "荔枝"); 
  dataset.addvalue(500, "广州", "荔枝"); 
  return dataset; 
 } 
  
 /** 
  * exports a jfreechart to a svg file. 
  * 
  * @param chart jfreechart to export 
  * @param bounds the dimensions of the viewport 
  * @param svgfile the output file. 
  * @throws ioexception if writing the svgfile fails. 
  */ 
 private static void exportchartassvg(jfreechart chart, rectangle bounds, file svgfile) throws ioexception { 
  // get a domimplementation and create an xml document 
  domimplementation domimpl = 
   genericdomimplementation.getdomimplementation(); 
  document document = domimpl.createdocument(null, "svg", null); 
 
  // create an instance of the svg generator 
  svggraphics2d svggenerator = new svggraphics2d(document); 
 
  // draw the chart in the svg generator 
  chart.draw(svggenerator, bounds); 
 
  // write svg file 
  outputstream outputstream = new fileoutputstream(svgfile); 
  writer out = new outputstreamwriter(outputstream, "utf-8"); 
  svggenerator.stream(out, true /* use css */);       
  outputstream.flush(); 
  outputstream.close(); 
 } 
} 

用这个的时候需要注意两点:

1 .jfreechart本身不能生成svg图形,需要用到batik .一个java工具包,apache的.

batik-awt-util.jar
batik-dom.jar
  batik-svggen.jar
  batik-util.jar
batik-xml.jar
jfreechart-1.0.0.jar

2.就是可能生成svg,当你查看的时候不支持中文. 我记得好像是如果是安装的adobe的那个查看器,在ie里面浏览的话好像是中文乱码,如果用另外一个叫做 renesis svg player ,这个查看器就是支持中文的.

以上内容就是java生成饼图svg及jfreechart生成svg图表的全部内容,希望大家喜欢。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网