Проблемы здесь заключаются в том, что большая часть круга находится за пределами viewBox (его ширина составляет всего 1 единицу, а ширина круга составляет 20 единиц), а соотношение сторон viewBox отличается от соотношения сторон его контейнера.
По умолчанию для preserveAspectRatio поддерживается соотношение сторон, а не искажение формы, поэтому нам все же нужно нарисовать круг, а не эллипс. Поскольку область рисования является квадратной, то круг будет рисоваться в этой квадратной области, а поскольку высота области просмотра равна 20, у нас будет область 20 x 20, чтобы нарисовать круг, чтобы нарисовать круг.
Что мы делаем с шириной viewBox в 1 единицу? Как мы отображаем от 0-1 до 20 единиц? Нам нужно сохранить среднее значение viewBox, так что это 0.5.
Нам нужно решить эти уравнения тогда для x и y: (x + y) / 2 = 0.5 (оставьте центр одинаковым) и y - x = 20 (оставьте ширину такой же, как высота, чтобы сохранить аспект отношение)
Здесь делаем математику: x + y = 1 -> y - (1 - y) = 20 -> 2y - 1 = 20 -> y = 10,5 и x = -9,5.
Итак, мы собираемся отобразить 0 - 20 для высоты и -9,5 - 10,5 по ширине, что означает, что вы увидите примерно (но не совсем) полукруг. Вы на самом деле видите чуть больше половины круга.