Это мой первый проект SVG, и я не программист, но я играю в интерактивную инфографику. Мой предыдущий опыт в этой области исходит от работы с ActionScript.SVG Scaling and Coordinates
Я использую простой SVG (без Raphael, D3 и т. Д.) И пытаюсь создать интерактивный барчер. Через некоторое начальное затруднение с SVG системы и масштабирования координат, я нашел код в Интернете, который обрабатывает postscaling перевод:
<text x="x_coord0" y="y_coord0" transform="scale(x_scale, y_scale) translate(-x_coord0*(x_scale-1)/x_scale, -y_coord0*(y_scale-1)/y_scale)" …>text</text>
И я преобразовал его в этот JavaScript:
var translationfactor = ((0 - y_position)*(y_scalefactor - 1)/y_scalefactor);
var matrix = "scale(1," + y_scalefactor + ") translate(0," + Number(translationfactor) + ")";
targetbar.setAttribute("transform", matrix);
Проблема заключается в том, что я нужно, чтобы бары «переводились» обратно в базовую линию графика, а не в исходные местоположения их самых верхних точек. В настоящее время правильно масштабируется бары прижимаясь к верхней части диаграммы:
http://billgregg.net/miscellany/upsidedown-barchart.png
Я пытался несколько исправлений, в том числе подключить „недостающее высоту“ БАРС в translationfactor (бары начинают полную высоту диаграмму и динамически уменьшаться). Ничего не сработало. Часть моей проблемы заключается в том, что, помимо того, что я новичок в SVG, я могу смотреть на этот код весь день, и мой мозг все еще не может его разобрать. Умножение отрицательных чисел слишком абстрактно и на фундаментальном уровне я просто не «получаю» математику, что, конечно, затрудняет изменение кода.
Мои вопросы:
(1) Что такое исправление кода выше, чтобы позиционировать стержни обратно на базовой линии на графике?
(2) Существует ли более прозрачный, более пешеходный способ выполнения перевода? Моя первая мысль по этим строкам заключалась в том, что если высота бара уменьшается до 40% от его первоначального значения, то умножение исходного значения координаты Y на 250% должно привести к сбросу бара в исходное местоположение (по крайней мере, его верхнюю точку), но это похоже, не работает.
(3) Есть ли способ установить точку начала бара на дно? Во Flash это возможно, хотя, насколько я знаю, это руководство, а не программная задача.
(4) Есть ли метод, похожий на .localToGlobal() в ActionScript, который позволит мне избежать необходимости связываться с локальной системой координат?
Спасибо, BigBadaboom, за то, что нашли время, чтобы составить такой тщательный ответ. Извините, если я не был ясен, но это для интерактивного SVG. Я загрузил копию сейчас, что-то, что я должен был сделать в первую очередь: http://www.50laboratories.com/miscellany/demographicclout14.svg Гистограмма в основном работает, за исключением проблемы с размещением столбцов выше (полосы, висящие сверху диаграммы) и пару строк кода, которые я еще не добавил, которые будут обнулять бары за годы до того, как государство будет допущено в профсоюз. –
До сих пор я предполагал, что SVG-код в формате XML может срабатывать только один раз при загрузке SVG, и любой код, который будет инициирован пользователем, должен быть в виде функции JavaScript. Я ошибаюсь? Помимо команды transform, я не уверен, как бы перевести код выше в JavaScript. –
Еще одна проблема, которую вы заметите, если используете Firefox (первоначально я не собирался спрашивать об этом в этом сообщении) заключается в том, что позиционирование бара нестабильно. Хотя диаграмма правильно рисуется при загрузке, когда вы нажимаете на состояния и вызываете ее перерисовывание, бары дрейфуют вверх и снаружи диаграммы. Насколько я могу судить об этой ошибке в Chrome. Я еще не тестировал его в других браузерах. –