@@ -4551,15 +4551,23 @@ namespace matplot {
4551
4551
double v_max = *std::max_element (v.begin (), v.end ());
4552
4552
double y_max = ydiffmin != y_diff.end () ? *ydiffmin : v_max;
4553
4553
4554
+ // scale u, v with same ratio to retain direction
4555
+ double mag_max = 1 ;
4556
+ for (size_t i = 0 ; i < u.size (); ++i) {
4557
+ double mag = sqrt (u[i] * u[i] + v[i] * v[i]);
4558
+ mag_max = mag > mag_max ? mag : mag_max;
4559
+ }
4560
+ double val_max = std::min (x_max, y_max);
4561
+
4554
4562
auto u_scaled =
4555
4563
(scale != 0 .)
4556
4564
? transform (
4557
- u, [&](double u) { return (u / u_max ) * scale * x_max ; })
4565
+ u, [&](double u) { return (u / mag_max ) * scale * val_max ; })
4558
4566
: u;
4559
4567
auto v_scaled =
4560
4568
(scale != 0 .)
4561
4569
? transform (
4562
- v, [&](double v) { return (v / v_max ) * scale * y_max ; })
4570
+ v, [&](double v) { return (v / mag_max ) * scale * val_max ; })
4563
4571
: v;
4564
4572
4565
4573
vectors_handle l = std::make_shared<class vectors >(
@@ -4640,20 +4648,28 @@ namespace matplot {
4640
4648
double w_max = *std::max_element (w.begin (), w.end ());
4641
4649
double z_max = zdiffmin != z_diff.end () ? *zdiffmin : w_max;
4642
4650
4651
+ // scale u, v, w with same ratio to retain direction
4652
+ double mag_max = 1 ;
4653
+ for (size_t i = 0 ; i < u.size (); ++i) {
4654
+ double mag = sqrt (u[i] * u[i] + v[i] * v[i] + w[i] * w[i]);
4655
+ mag_max = mag > mag_max ? mag : mag_max;
4656
+ }
4657
+ double val_max = std::min (std::min (x_max, y_max), z_max);
4658
+
4643
4659
auto u_scaled =
4644
4660
(scale != 0 .)
4645
4661
? transform (
4646
- u, [&](double u) { return (u / u_max ) * scale * x_max ; })
4662
+ u, [&](double u) { return (u / mag_max ) * scale * val_max ; })
4647
4663
: u;
4648
4664
auto v_scaled =
4649
4665
(scale != 0 .)
4650
4666
? transform (
4651
- v, [&](double v) { return (v / v_max ) * scale * y_max ; })
4667
+ v, [&](double v) { return (v / mag_max ) * scale * val_max ; })
4652
4668
: v;
4653
4669
auto w_scaled =
4654
4670
(scale != 0 .)
4655
4671
? transform (
4656
- w, [&](double w) { return (w / w_max ) * scale * z_max ; })
4672
+ w, [&](double w) { return (w / mag_max ) * scale * val_max ; })
4657
4673
: w;
4658
4674
4659
4675
vectors_handle l = std::make_shared<class vectors >(
0 commit comments