Gráficos vectoriales escalables en HTML5. Gráficos vectoriales escalables (SVG) - Gráficos de exploración Etiquetas

Los gráficos vectoriales son ampliamente utilizados en la impresión. Pero para sitios web, también podemos usarlo con SVG ( Gráfico vectorial escalable - gráficos vectoriales escalables). Según la especificación W3.org, SVG se define como:

Un lenguaje para describir gráficos bidimensionales en XML. SVG permite el uso de tres tipos de objetos: formas gráficas vectoriales (por ejemplo, rutas formadas por líneas rectas y curvas), imágenes y texto.

Aunque desde agosto de 2011 SVG está incluido en las recomendaciones del W3C, esta tecnología Prácticamente no se usa en proyectos web, aunque tiene una serie de ventajas sobre los mapas de bits. En esta serie de tutoriales, presentaremos cómo trabajar con elementos SVG en páginas web.

Beneficios de SVG

Resolución Independencia

Las imágenes rasterizadas dependen de la resolución. Los gráficos se vuelven impresentables cuando se redimensionan a ciertas escalas. Con los gráficos vectoriales, tal situación es imposible en principio, ya que todo está representado por expresiones matemáticas que se recalculan automáticamente cuando cambia la escala y la calidad se conserva en cualquier condición.

Reducir el número de solicitudes HTTP

SVG se puede incrustar directamente en un documento HTML usando la etiqueta svg, por lo que no es necesario solicitar al navegador que sirva los gráficos. Este enfoque tiene un buen efecto en las características de carga del sitio web.

Estilos y guiones

La incrustación con la etiqueta svg también facilita el diseño de gráficos con usando CSS. Puede cambiar las propiedades de los objetos, como el color de fondo, la transparencia, los bordes, etc. Del mismo modo, los gráficos se pueden manipular con JavaScript.

Fácil de editar y animar

Los objetos SVG se pueden animar usando CSS o JavaScript. Además, los objetos SVG se pueden modificar mediante un editor de texto.

Tamaño de archivo más pequeño

SVG tiene un tamaño de archivo más pequeño en comparación con los gráficos de trama.

Formas SVG básicas

Según la especificación, podemos dibujar varias formas básicas: línea, polilínea, rectángulo, círculo, elipse. Todos los elementos deben ser insertados en la etiqueta. ... . Considere los elementos básicos en detalle.

Línea

Un elemento se usa para dibujar una línea en SVG . Dibuja un segmento para el que se deben definir dos puntos: el inicio y el final.

El inicio del segmento está definido por los atributos x1 e y1, y el punto final está definido por las coordenadas en los atributos x2 e y2.

También hay otros dos atributos (trazo y ancho de trazo) que se utilizan para definir el color y el ancho de la línea, respectivamente.

Este objeto es similar a , pero con el elemento Puede dibujar varias líneas a la vez.

Elemento Contiene el atributo de puntos, que se utiliza para especificar las coordenadas de los puntos.

Rectángulo renderizado con elemento . Necesitamos definir el ancho y la altura.

Para dibujar un círculo, utilice el elemento . En el siguiente ejemplo, creamos un círculo con un radio de 100 , que se define en el atributo r:

Los dos primeros atributos cx y cy definen las coordenadas del centro. En el ejemplo anterior, hemos establecido ambas coordenadas en 102. El valor predeterminado es 0.

Para dibujar una elipse, use el elemento . Funciona como un círculo, pero podemos establecer específicamente los radios x e y usando los atributos rx y ry:

Elemento Muestra formas poliédricas como un triángulo, un hexágono, etc. Por ejemplo:

Uso del editor de gráficos vectoriales

Renderizar objetos SVG simples a HTML es fácil. Sin embargo, a medida que aumenta la complejidad del objeto, esta práctica puede llevar a una gran cantidad de trabajo por realizar.

Pero puede usar cualquier editor de gráficos vectoriales (por ejemplo, Ilustrador Adobe o paisaje de tinta) para crear objetos. Si posee una herramienta de este tipo, es mucho más fácil dibujar los objetos necesarios en ellos que codificar gráficos en una etiqueta HTML.

Puede copiar comandos para gráficos vectoriales desde un archivo a un documento HTML. O bien, puede incrustar el archivo .svg usando uno de los siguientes elementos: incrustar, iframe y objeto.

El resultado será el mismo.

Compatibilidad con navegador

SVG tiene un buen soporte en la mayoría de los navegadores modernos, con la excepción de la versión 8 de IE y anteriores. Pero la tarea se puede resolver usando la biblioteca de JavaScript. Para facilitar las cosas, puede usar la herramienta ReadySetRaphael.com para convertir el código SVG al formato Raphael.

Primero, cargamos e incluimos la biblioteca en un documento HTML. Luego cargamos el archivo .svg, copiamos y pegamos el código resultante en la función después de cargar:

En la etiqueta del cuerpo colocamos el siguiente elemento div con el ID rsr.

Y todo está listo.

En el siguiente tutorial de la serie, veremos cómo diseñar objetos SVG en CSS.

(Artículo de resumen después de la conferencia de desarrollo de software en Ekaterimburgo y otras presentaciones. Versión en video del informe en Ekaterimburgover techdays.ru )

¿Qué es HTML5 Canvas y SVG?

Lienzo HTML5

– el elemento es un lienzo para representar gráficos de mapa de bits. De hecho, este es un bloque vacío. dimensiones dadas, en el que puede dibujar utilizando API especiales para JavaScript.

La API incluye 45 métodos especiales y 21 atributos que se utilizan para mostrar primitivos gráficos, establecer estilos, transformaciones, acceder a píxeles individuales, proyectar imágenes y videos.

Yo mismo el elemento se define directamente en la especificación HTML5. La API para ello se describe en un documento separado: HTML Canvas 2D Context.

SVG

La música puede ser divertida

Un hermoso juego de visualización musical (http://musiccanbefun.edankwan.com/).

Ejemplos de esquemas SVG

Diagrama del esqueleto humano, tabla periódica de elementos químicos y sistema respiratorio (http://ie.microsoft.com/testdrive/Graphics/RealWorldDataAndDiagrams/Default.xhtml).

Mapas Yandex

Un ejemplo más cercano de la vida real es el uso de SVG al representar rutas (si el navegador lo admite). Vea también la charla "Mapas y SVG" de nuestro HTML5 Camp.

Más ejemplos:

  • Beauty of the Web http://www.beautyoftheweb.com/ - sitios reales del mundo real
  • Dev: unplugged http://contest.beautyoftheweb.com/ - proyectos que participan en la competencia de aplicaciones HTML5

Diferencia entre Canvas y SVG

En varios escenarios, Canvas o SVG pueden ser más adecuados para la representación dinámica de gráficos; volveremos a este tema al final. Mientras tanto, centrémonos en las diferencias clave entre uno y otro:

Lienzo SVG
Formato Ráster Vector
Escalada
Acceso

Acceso a píxeles individuales (RGBA)

Acceso a elementos individuales (DOM)

Indexabilidad y Accesibilidad

Solo se ve el ráster final (no puede seleccionar formas, texto, etc.) - malo para la accesibilidad

Puede ver la estructura (por ejemplo, extraer todo el texto)

estilización

Los estilos visuales se establecen al renderizar a través de API

Los estilos visuales se establecen por atributos, puede incluir CSS

Programación

JS API para trabajar con primitivas

DOM para trabajar con elementos

Actualizar

Para actualizar: dibuje sobre o redibuje completamente

Es posible cambiar elementos individuales.

Desarrollos

No hay una manera fácil de manejar los eventos del mouse. Los objetos debajo del cursor deben definirse manualmente.

Los eventos desde el mouse a través de DOM se cuelgan fácilmente, se procesan automáticamente.

Integración de código

Código JS separado de Canvas

Puedes incluir JS dentro

Estas diferencias deben tenerse en cuenta al utilizar una determinada tecnología para la visualización de datos. Por ejemplo, dibujar un gráfico de una función puede ser más fácil con Canvas, mientras que mostrar información sobre herramientas (con la definición de un objeto debajo del puntero del mouse) es más fácil con SVG.

En la práctica, sin embargo, ya existe una serie de bibliotecas listas para usar para la visualización de datos que compensan parcialmente estas diferencias.

No entraré en los conceptos básicos del trabajo con cada una de las tecnologías, como introducción recomiendo el informe de Vadim Makeev (Opera) del HTML5 Camp "Dynamic Graphics: Canvas and SVG".

Ver también informes MIX 2011:

Procesamiento de imágenes con Canvas

Una de las características notables de Canvas es que esta tecnología brinda acceso píxel por píxel a los datos mostrados y permite que varios elementos gráficos, incluido el video, se proyecten en el lienzo.

Un buen ejemplo de dónde se necesita esto es en una tarea de análisis/procesamiento de imágenes.

Processing.js ofrece dos enfoques para la descripción de la visualización: código intermedio, analizado por la propia biblioteca (en un archivo separado o dentro de la página) y código JavaScript explícito.

Por ejemplo, para dibujar un conjunto fractal de Mandelbrot, puede usar la opción que se muestra en la página con el ejemplo correspondiente o el siguiente código JavaScript:

var xmín = -2,5; varímin = -2; var wh = 4; función sketchProc(procesamiento) (procesamiento.setup = function () (procesamiento.size(200, 200); procesamiento.noLoop(); ); procesamiento.draw = function () (procesamiento.loadPixels(); var maxiterations = 200; var xmax = xmin + wh; var ymax = ymin + wh; var dx = (xmax - xmin) / (procesamiento.ancho); var dy = (ymax - ymin) / (procesamiento.altura); var y = ymin; para (var j = 0; j< processing.height; j++) { var x = xmin; for (var i = 0; i < processing.width; i++) { var a = x; var b = y; var n = 0; while (n < maxiterations) { var aa = a * a; var bb = b * b; var twoab = 2.0 * a * b; a = aa - bb + x; b = twoab + y; if (aa + bb >16.0) (descanso;) n++; ) if (n == maxiteraciones) procesamiento.pixeles.setPixel(i+j*procesamiento.ancho, 0); else procesamiento.píxeles.setPixel(i+j*procesamiento.ancho, procesamiento.color(n*16 % 255)); x += dx; ) y += dy; ) procesamiento.updatePixels(); ); ) var canvas = document.getElementById("myCanvas" ); var p = nuevo procesamiento (canvas, sketchProc);

Puede probarlo usted mismo aquí: http://silverbook.ru/projects/html5datavisualization/demo3-processingjs.htm (copie el código, péguelo en la consola y ejecútelo).

Kit de herramientas de JavaScript InfoVis (JIT)

Para mostrar datos, JIT acepta valores sin procesar como JSON:

var json = ("etiqueta": ["etiqueta A", "etiqueta B", "etiqueta C", "etiqueta D"], "valores": [("etiqueta": "fecha A", "valores":) , ( "etiqueta" : "fecha B", "valores" : ), ( "etiqueta" : "fecha E" , "valores" : ), ( "etiqueta" : "fecha F", "valores" : ), ( "etiqueta" : "fecha D", "valores" : ), ( "etiqueta" : "fecha C" , "valores" : )] ); var pieChart = new $jit.PieChart(( injectInto: "infovis" , animate: true , offset: 30, sliceOffset: 0, labelOffset: 20, type: "stacked:gradient", showLabels:true , resizeLabels: 7, Label: ( tipo: "Nativo", tamaño: 20, familia: "Arial", color: "blanco"), Sugerencias: (habilitar: verdadero, onShow: function (tip, elem) ( tip.innerHTML = " "+ elem.nombre + ": " + valor.elemento; ) ) ));

es suficiente llamar dibujo:

Gráfico circular.loadJSON(json);

Minigráficos de jQuery

Visualización de mapas con SVG

Pasemos a SVG y comencemos con un ejemplo simple. Imagina que necesitas mostrar algunos datos en un mapa de regiones, ¿cuál es la forma más fácil de hacerlo?

Si tiene un mapa listo en forma de SVG (tomé un mapa de Rusia del sitio de Wikipedia), esto se hace de manera muy simple: es suficiente que cada región tenga su propia identificación única dentro del documento SVG, entonces insertamos el mapa como svg en línea y lo coloreamos con un código simple en el color correcto:

var SverdlovskOblast = document.getElementById("SverdlovskOblast" ); Óblast de Sverdlovsk.style.fill = "#fe3300" ;

Si hace lo mismo en un bucle, ya puede colorear no solo la región, sino toda la región o incluso todo el país:

var datos = [(id: "KurganOblast" , valor: 30), (id: "SverdlovskOblast" , valor: 200), (id: "TyumenOblast" , valor: 75), (id: "KhantiaMansia" , valor: 100 ), (id: "YamaloNenetsAutDistrict", valor: 20), (id: "ChelyabinskOblast", valor: 150)]; para (var i = 0; i< data.length; i++) { var item = data[i]; var region = document.getElementById(item.id); region.style.fill = RGBtoHex(item.value, 0, 0); }

Bibliotecas para visualizar datos con SVG

Como decía, tanto Canvas como SVG son aptos para resolver la tradicional tarea de visualizar datos numéricos en forma de gráficos y tablas. En ambos casos, esto es bastante fácil de hacer con las bibliotecas apropiadas.

Ya hemos visto los ejemplos de Canvas, ahora veamos varias bibliotecas para trabajar con SVG. (Esta tampoco es una lista exhaustiva, sino soluciones populares y de alta calidad).

Rafael

Para agregar un sencillo Gráfico circular suficiente código como este:

var r = Raphael("tabla" , 640, 480); var pie = r.g.piechart(320, 240, 100, );

Con algunas operaciones adicionales, puede agregar una leyenda, leyendas de gráficos e información sobre herramientas interactiva:

var r = Raphael("tabla" , 640, 480); r.g.txtattr.font = "12px "Fuente Sans", Fuente Sans, sans-serif"; r.g.text(320, 100, "Gráfico circular interactivo" ).attr(("tamaño de fuente" : 20)); var tarta = r.g. piechart(320, 240, 100, ,
(leyenda: ["%%.%% – Usuarios empresariales", "Usuarios de IE"], leyendapos: "oeste",
href: ["http://raphaeljs.com" , http://g.raphaeljs.com]});
pie.hover(function () ( this .sector.stop(); this .sector.scale(1.1, 1.1, this .cx, this .cy); if (this .label) ( this .label.stop(); this .label.scale(1.5); this .label.attr(("font-weight" : 800)); ) ), function () ( this .sector.animate((scale: ), 500, "bounce" ) if (this .label) ( this .label.animate((scale: 1), 500, "bounce" ); this .label.attr(("font-weight" : 400)); ) ));

Del mismo modo, puede mostrar otros tipos de gráficos utilizando los métodos apropiados. Vea ejemplos directamente en el sitio de extensión http://g.raphaeljs.com/

HighchartsJS

La API de la biblioteca facilita bastante la generación de un gráfico a partir de datos en JSON:

var chart1 = new Highcharts.Chart(( chart: ( renderTo: "charts" , defaultSeriesType: "bar" ), title: ( texto: "Consumo de frutas" ), xAxis: (categorías: ["Manzanas" , "Plátanos" , "Naranjas" ] ), yAxis: ( título: ( texto: "Frutas comidas" ) ), serie: [( nombre: "Jane" , datos: ), ( nombre: "Juan" , datos: )] ));

Con un script un poco más complejo, puede especificar detalles adicionales, por ejemplo, mostrar una leyenda, configurar información sobre herramientas:

var chart = new Highcharts.Chart(( chart: ( renderTo: "charts" , defaultSeriesType: "area" , spacingBottom: 30 ), title: ( texto: "Consumo de frutas *" ), subtitle: ( text: "* El consumo de bananas de Jane es desconocido", flotante: verdadero, alinear: "derecha", verticalAlign: "abajo", y: 15), leyenda: (diseño: "vertical", alinear: "izquierda", verticalAlign: "arriba", x: 150, y: 100 , flotante: true , borderWidth: 1, backgroundColor: "#FFFFFF" ), xAxis: (categorías: ["Manzanas" , "Peras" , "Naranjas" , "Plátanos" , "Uvas" , "Ciruelas" , "Fresas" , "Frambuesas" ] ), yAxis: ( título: ( texto: "Y-Axis" ), etiquetas: ( formateador: función () ( devuelve este .valor; ) ) ), información sobre herramientas: ( formateador: función () ( retorno " "+esta.serie.nombre+"
" + this .x +": " + this .y; ) ), plotOptions: ( area: ( fillOpacity: 0.5 ) ), series: [( name: "John" , data: ), ( name: "Jane" , datos: )] ));

Si es necesario, puede reemplazar los estilos predeterminados por los suyos propios.

¿Qué elegir: lienzo o SVG?

Como puede ver en los ejemplos anteriores, ambas tecnologías suelen ser adecuadas para tareas de visualización de datos. Muchas cosas se hacen de manera similar. En los casos en que se necesita una salida píxel por píxel, Canvas obviamente es más adecuado. Cuando el diagrama se divide en objetos separados que deben ser interactivos, SVG es más adecuado.

el lienzo es mejor
  • Edición de gráficos de mapa de bits
  • Aplicación de efectos a gráficos/video
  • Generación de gráficos raster (visualización de datos, fractales, gráficos de funciones)
  • Análisis de imagen
  • Gráficos del juego (sprites, fondo, etc.)
SVG es mejor
  • Interfaces escalables
  • Interfaces interactivas
  • diagramas, esquemas
  • Edición de imágenes vectoriales

En forma gráfica, esto se puede representar de la siguiente manera:

Finalmente, otro corte importante que también es importante considerar al elegir una tecnología es el rendimiento de renderizado cuando se usa Canvas y SVG:

En la práctica, el lienzo funciona mejor con tamaños de área de procesamiento pequeños y una gran cantidad de objetos, en SVG es más adecuado cuando se escala o se muestra en una pantalla grande y no demasiado. en numeros grandes objetos emitidos a la vez.

Esta conclusión se deriva del informe del presidente de la junta de Bashneft, anunciado a la junta general de accionistas de la empresa, una copia del cual se puso a disposición de los editores.

Del documento se desprende que como resultado de la exploración geológica, en 2018 se descubrieron 81 yacimientos productivos con reservas de 19 millones de toneladas.

Al mismo tiempo, el uso de medidas geológicas y técnicas altamente efectivas y la introducción de tecnologías modernas para la recuperación mejorada de petróleo hicieron posible mantener la producción de petróleo en campos maduros en Bashkiria al nivel de 2017 de 15 millones de toneladas luego de los resultados de 11 meses. . El volumen total de producción para el período especificado ascendió a 17,3 millones de toneladas de petróleo.

El informe también señala que la creación de una cadena de producción única con el complejo de producción y procesamiento de Rosneft aumentó la eficiencia de las refinerías de Ufa y condujo a una reducción de los costos operativos y logísticos. En particular, se ha dominado la producción de gasolina Euro-6 y se ha iniciado la producción industrial de betún para carreteras de acuerdo con el nuevo GOST.

El volumen de ventas minoristas en las estaciones de servicio Bashneft durante 11 meses de 2018 aumentó un 13,2 por ciento en comparación con el mismo período del año pasado y alcanzó los 1,7 millones de toneladas.

Para implementar la estrategia en el campo de la petroquímica, se está modernizando la producción petroquímica. Así, en mayo de 2018, Ufaorgsintez puso en funcionamiento nueva instalación producción de cumeno - materias primas para la fabricación de pinturas, solventes, diversos polímeros utilizados en la industria automotriz, medicina y farmacología. Lo siguiente en línea es la reconstrucción del complejo de producción de aromáticos en Ufaneftekhim, la construcción de nuevas unidades de producción de olefinas en Ufaorgsintez.

El indicador consolidado de beneficio operativo durante 9 meses de 2018 aumentó un 22,6 por ciento en comparación con el mismo período de 2017 y ascendió a 135,5 mil millones de rublos. El beneficio neto de Bashneft alcanzó los 74.600 millones de rublos, un 73,5 por ciento más que en el mismo período del año pasado.

Durante el tercer trimestre, Bashneft pagó dividendos a los accionistas anunciados en la reunión anual de junio de 2018 por un monto de 28,2 mil millones de rublos, y el monto total de los dividendos pagados desde el comienzo del año ascendió a 43 mil millones de rublos.

Al mismo tiempo, el nivel de la deuda neta de la empresa disminuyó y al 30 de septiembre de 2018 ascendía a 40,1 mil millones de rublos (a la misma fecha de 2017, esta cifra era de 104,7 mil millones de rublos).

Al mismo tiempo, durante el período del informe, las deducciones fiscales al presupuesto de Bashkortostán, teniendo en cuenta el pago único del impuesto sobre la renta, aumentaron 1,5 veces en comparación con el mismo período del año pasado y ascendieron a 50.500 millones de rublos.

Hay una etiqueta para incluir una imagen en un lugar específico de la página. . Esta etiqueta tiene un parámetro obligatorio: SRC="", y varios opcionales. El parámetro SRC="" le dice al navegador dónde buscar el gráfico y debe tener como valor la URL del recurso donde se encuentra el archivo gráfico. En el caso más simple, este archivo se colocará en el directorio raíz o en la carpeta IMG de su sitio. Parámetros opcionales:

El parámetro ALT="" contiene una inscripción como valor que informa sobre el contenido de la imagen para aquellos visitantes cuyos navegadores no admiten gráficos o funcionan en modo gráfico deshabilitado. La misma inscripción aparece cuando pasa el mouse sobre la imagen.

Los parámetros WIDTH="" HEIGHT="" tienen como valores las dimensiones de la imagen en términos de ancho y alto en píxeles. Es deseable especificar estos parámetros en el código de la página para que el navegador deje espacio para la imagen de antemano, luego, al cargar, la página "temblará" menos. Además, estos parámetros se pueden utilizar para ajustar el tamaño de la imagen en la ventana del navegador.

El parámetro BORDER="" dibuja un borde alrededor de la imagen. El valor es un número que indica el ancho del marco en píxeles.

El parámetro ALIGN= determina la posición de la imagen en la página y puede tomar valores TOP: alinea el borde superior de la imagen con el elemento más alto de la línea actual, TEXTTOP: alinea el borde superior de la imagen con el más alto elemento de texto de la línea actual, MEDIO: alinea el centro de la imagen con la línea base de la línea actual, ABSMEDIO: alinea el centro de la imagen con el centro de la línea actual. BASE o BOTTOM: alinea el borde inferior de la imagen con la línea base de la línea actual, ABSBOTTOM: alinea el borde inferior de la imagen con el borde inferior de la línea actual, HSPACE=: define la sangría horizontal, VSPACE=: define el sangría vertical.

Sintaxis de la etiqueta:

Corazón

La línea de ejecución está establecida por la etiqueta. .

Los atributos de esta etiqueta son bgcolor: el color de fondo de la línea de desplazamiento, height: la altura de la línea, width: la anchura de la línea.

Dirección - establece la dirección de movimiento del ticker - dirección="izquierda" (derecha, arriba, abajo) - movimiento hacia la izquierda (derecha, arriba, abajo).

Comportamiento - comportamiento de cadena - comportamiento="desplazamiento" (diapositiva, alternativa). Desplazamiento: desplazamiento normal (no puede prescribirlo, es el predeterminado)



Deslizar: al desplazarse con una parada, la línea se extiende hasta el borde y se detiene. Si el parámetro de bucle se usa simultáneamente con behavor="slide" , la línea se desplazará el número de veces establecido y se detendrá en el borde. Alternativo: la línea se moverá de borde a borde.
Scrollamount - velocidad de línea, scrollamount="1". Puede tomar valores del 1 al 10. 1 es el movimiento más lento, 10 es el más rápido.

Sintaxis de la etiqueta: texto

Los navegadores web modernos pueden reproducir archivos de video y audio en una variedad de formatos. Para ello, utilizan reproductores integrados (complementos, controles ActiveX) o programas reproductores externos. Puede insertar sonido o video en un documento HTML usando varias etiquetas:

- para insertar sonido de fondo;

- para insertar video en formato AVI;

- para insertar archivos de sonido y video;

- para insertar archivos de sonido y video.

Cuando decida incrustar audio y/o video en un documento HTML, tenga en cuenta que los archivos correspondientes son bastante grandes. Los formatos de video más populares en la web ahora son MP3, WMA, AIFF, AU, RealAudio (ra y ram), MP4, MIDI y MPEG, MOV. El formato de audio WAV y el formato de video AVI rara vez se usan en Internet.