Я делаю визуализацию данных примерно так:
и было бы удобно использовать viewBox
для масштабирования SVG, чтобы ширина графика масштабировалась до ширины диапазона данных.
Моя точка данных в этом примере - 12 549, и поэтому я хочу, чтобы диапазон работал от 0 до 14 000, и отрендерил это в viewBox
шириной 14 000, используя rect
шириной 12 549. Другими словами, использовать натуральные единицы для моих данных.
Но когда я это делаю, шрифт на моей оси также масштабируется, а шрифт 10px также масштабируется и становится настолько маленьким, что его не видно.
Так что мне нужен способ масштабирования блоков рисования без масштабирования блоков шрифта, но я не вижу способа сделать это.
Обновление
Вот код, о котором идет речь:
<svg width="960" height="50" class="bullet2" style="margin-top: 10px;">
<svg viewBox="0 0 14000 25" preserveAspectRatio="none" width="100%" height="25" class="bars">
<rect x="0" y="0" width="14000" height="25" class="background"/>
<rect x="0" y="0" height="12.5" width="12549" class="item player"/>
<rect x="0" y="12.5" height="12.5" width="3750" class="item team-average"/>
<line x1="2000" x2="2000" y1="0" y2="25" class="marker" style="stroke-width: 29.1667px;"/>
</svg>
<g class="axis">
<g transform="translate(0, 25)" class="tick" style="opacity: 1;">
<line y1="0" y2="5"/>
<text text-anchor="middle" dy="1em" y="6">0</text>
</g>
<g transform="translate(140, 25)" class="tick" style="opacity: 1;">
<line y1="0" y2="5"/>
<text text-anchor="middle" dy="1em" y="6">2000</text>
</g>
<g transform="translate(280, 25)" class="tick" style="opacity: 1;">
<line y1="0" y2="5"/>
<text text-anchor="middle" dy="1em" y="6">4000</text>
</g>
<g transform="translate(420, 25)" class="tick" style="opacity: 1;">
<line y1="0" y2="5"/>
<text text-anchor="middle" dy="1em" y="6">6000</text>
</g>
<g transform="translate(560, 25)" class="tick" style="opacity: 1;">
<line y1="0" y2="5"/>
<text text-anchor="middle" dy="1em" y="6">8000</text>
</g>
<g transform="translate(700, 25)" class="tick" style="opacity: 1;">
<line y1="0" y2="5"/>
<text text-anchor="middle" dy="1em" y="6">10000</text>
</g>
<g transform="translate(840, 25)" class="tick" style="opacity: 1;">
<line y1="0" y2="5"/>
<text text-anchor="middle" dy="1em" y="6">12000</text>
</g>
<g transform="translate(980, 25)" class="tick" style="opacity: 1;">
<line y1="0" y2="5"/>
<text text-anchor="middle" dy="1em" y="6">14000</text>
</g>
</g>
</svg>
Обратите внимание на viewBox
на внутреннем элементе svg
, масштабируя его, как описано. Я попробовал это с тем же масштабированием на внешнем элементе svg
, который также включает ось, но когда я делаю это, изображение выглядит так:
Метки осей есть, но они также масштабированы, а шрифт 10px из 14000 пикселей масштабирования настолько мал, что вы его не видите.