Java generates the pie chart svg and ikevg
Package com. tellhow. svg;
Import java. io. File;
Import java. io. FileOutputStream;
/**
*
* @ Author highlights NO.1
*
*/
Public class CakySvgWithLabel {
// Define different colors
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/5o/xlink '");
Sfile. append ("\ n ");
Sfile. append ("xml: space = 'default '");
Sfile. append ("\ n ");
Sfile. append ("version = '1. 1' width = '000000' height = '000000' viewBox = '0 0 100% 100% '> ");
Sfile. append ("\ n ");
Sfile. append ("<defs> </defs> ");
Sfile. append ("\ n ");
Sfile. append ("<g stroke-width = '1' stroke = '# ffff' transform = 'matrix (16.384, 9.83,-)' xmlns = 'HTTP: // www.w3.org/2000/svg'> ");
Sfile. append ("\ n ");
// Create path labels cyclically.
String path = creatPath (502,300,300, percents, names); // center point 503,300.
Sfile. append (path );
Sfile. append ("</g> ");
Sfile. append ("\ n ");
Sfile. append ("</svg> ");
Return sfile. toString ();
}
/**
*
* @ Param x0 center X coordinate
* @ Param y0 center ordinate
* @ Param r radius
* @ Param percents percentage Array
* @ Param names: name of the display color
* @ Return
*/
Public static String creatPath (double x0, double y0, double r, double [] percents, String [] names ){
StringBuffer sfile = new StringBuffer ();
Double x1 = 0; // x coordinate of the new sector
Double y1 = 0; // y coordinate of the new slice
Double middleX = 0; // coordinates displayed in the text, including coordinates displayed in the vertical bar
Double middleY = 0;
Double radian = 0; // radian
Double textRadian = 0; // text display location radians
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; // obtain the Coordinates precise to two decimal places.
K = Math. abs (middleY-y0)/(middleX-x0); // obtain the coordinates of the end point of the slice, and the slope of the straight line connected to the center. (take a positive value)
Double sita = Math. atan (k); // estimate the angle
Double lineLen = 50;
Double textLen = 70;
If (radian <6 ){
LineLen = 90;
TextLen = 110; // controls the length of the indicator line, and the position of the text
}
If (percents [I]! = 0) {// when the type is 0, the pie chart is displayed
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 = 'preserv' 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 = 'preserv' 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 = 'preserv' 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 = 'preserv' 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 =' # ffff' stroke-dasharray = '1, 1 '/> ");
Sfile. append ("\ n ");
Sfile. append ("<text x = '" + (x0 + 2 * r + 80) + "'Y ='" + (y0-r/2.0 + N + 25) + "'space = 'preserv' 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); // obtain the radians of the ing line and the X axis.
Radian = radian + getRadian (percents [I]); // The sum of radians before the slice 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) {// when the type is 0, the pie chart is displayed
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 = 'preserv' 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 = 'preserv' 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 = 'preserv' 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 = 'preserv' font-family = 'tahoma 'font-size = '21' fill = 'red' stroke = 'red' baseline-shift = 'baseline'> "+ percent +" % </text> ");
}
Sfile. append ("\ n ");
// Parameter 1 indicates the arc drawn greater than 180, and 0 indicates the arc drawn less than 180 (this is important)
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 =' # ffff' stroke-dasharray = '1, 1 '/> ");
Sfile. append ("\ n ");
Sfile. append ("<text x = '" + (x0 + 2 * r + 80) + "'Y ='" + (y0-r/2.0 + N + 25) + "'space = 'preserv' 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 ();
}
// Return radians
Public static double getRadian (double fenshu ){
Return (fenshu * Math. PI)/50;
}
// Returns the sine.
Public static double getSin (double radian ){
Return Math. sin (radian );
}
// Returns the cosine.
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 = {"main variable:" + data [0] + "," circuit breaker: "+ data [1] +", "line: "+ data [2] +", "Knife Gate:" + data [3] + "," Bus: "+ 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 ());
}
}
}