PsychrometricPlot#
PsychrometricPlot places a thermal comfort model on a psychrometric chart: dry-bulb temperature on the x-axis and humidity ratio on the y-axis. Constant relative-humidity curves are drawn automatically. The class converts each grid point’s humidity ratio to relative humidity before calling the model, so you pass the model function directly with no extra setup.
Note that tdb and hr are the fixed axis names — this chart type enforces them.
import matplotlib.pyplot as plt
from pythermalcomfort.models import pmv_ppd_ashrae, pmv_ppd_iso
from pythermalcomfort.plots.matplotlib import PsychrometricPlot
1. PMV ISO on a Psychrometric Chart#
This is the standard psychrometric view for ISO 7730 comfort assessment. The y-axis runs in humidity ratio (kg water per kg dry air). The grey curves in the background are constant relative humidity lines at 10 % intervals — they appear automatically.
psy_iso = (
PsychrometricPlot(pmv_ppd_iso)
.set_x_axis("tdb", 10.0, 40.0, resolution=1.0)
.set_y_axis("hr", 0.0, 0.030, resolution=0.001)
.set_params(vr=0.10, met=1.2, clo=0.5, tr=25.0)
.set_regions(
output="pmv",
thresholds=[-0.5, 0.5],
labels=["Cool (PMV < −0.5)", "Comfortable", "Warm (PMV > 0.5)"],
colors=["#0067B2", "#E8F0F9", "#C40025"],
)
.plot(title="Psychrometric Chart — PMV ISO 7730")
)
psy_iso.ax.set_xlabel("Dry-bulb temperature [°C]")
psy_iso.ax.set_ylabel("Humidity ratio [kg/kg]")
plt.show()
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:173: UserWarning: 'tdb' has 310 values [31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0] at indices [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960] outside the applicability limits [10.0, 30.0] and will be set to NaN.
tdb_valid = valid_range(tdb, (10.0, 30.0))
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:178: UserWarning: 'pmv' has 188 values [-2.8480352531149005, -2.658705298851658, -2.471022503342447, -2.2850570819839455, -2.100886451544277, -2.811866526343206, -2.6225316633410185, -2.4348444515125425, -2.2488750786559817, -2.064700934830481, -2.775813728693507, -2.5864739726860178, -2.3987823586935995, -2.212809047004443, -2.028631401054323, -2.739876303688214, -2.550531670333539, -2.3628356682645535, -2.17685843034747, -2.7040536984056107, -2.5147042032868288, -2.3270038271611373, -2.1410226755603863, -2.6683453634515115, -2.478991022077136, -2.291286285847519, -2.105301233047337, -2.632750752931166, -2.4433915807356223, -2.255682498288203, -2.069693556713189, -2.597269324421441, -2.407905336765541, -2.220191921920211, -2.034199103935701, 2.01144927033767, -2.5749568159595304, -2.372531751114676, -2.1848140176255155, 2.0468412738177935, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0821210962351895, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.117289270111753, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0095364727891525, 2.1523463246042085, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.044483825387187, 2.1872927855306443, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.079321104116445, 2.2221291753968067, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.114048828209616, 2.256856013422136, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0143271442090156, 2.148667513638799, 2.29147381556557, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.048838194134804, 2.18317767314106, 2.3259830945510873, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.083241224873996, 2.21757981624374, 2.3603843598930307, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1175367427823515, 2.2518744492895344, 2.394678117921177, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.017331191180959, 2.1517252510557485, 2.286062075461336, 2.4288648718055805, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.051414069246256, 2.185807249754786, 2.320143194806845, 2.462945121581182, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0853909319516197, 2.2197832358291714, 2.354118304262947, 2.496919364172188, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1192622731727586, 2.253653703141875, 2.3879878976798667, 2.5307880934162235, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0185808547434045, 2.1530285837224934, 2.2874191424930514, 2.421752465845099, 2.56455180008826, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.052243480858637, 2.186690351374462, 2.3210800416437536, 2.45541249650711, 2.5982109719243196, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0858020461802895, 2.2202480608866053, 2.3546368853394166, 2.4889684743988294, 2.6317660936449627, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1192570324861646, 2.2537021940244397, 2.388090155333126, 2.522420881260912, 2.6652176469785553, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0181073430082814, 2.1526089185846202, 2.287053229584112, 2.4214403304086765, 2.5557701958647985, 2.69856611068432, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.051357432433581, 2.185858180337406, 2.3203016434152404, 2.4546878864034074, 2.5890168940355514, 2.7318119605751816, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.084505367908146, 2.219005290682308, 2.3534479084435453, 2.4878332962308365, 2.6221614486744897, 2.76495566954039, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1175516194799076, 2.2520507196555566, 2.3864924946932717, 2.5208770299030854, 2.655204329781604, 2.7979977075679447] at indices [0, 1, 2, 3, 4, 31, 32, 33, 34, 35, 62, 63, 64, 65, 66, 93, 94, 95, 96, 124, 125, 126, 127, 155, 156, 157, 158, 186, 187, 188, 189, 217, 218, 219, 220, 247, 248, 249, 250, 278, 279, 280, 281, 309, 310, 311, 312, 340, 341, 342, 343, 370, 371, 372, 373, 374, 401, 402, 403, 404, 405, 432, 433, 434, 435, 436, 463, 464, 465, 466, 467, 493, 494, 495, 496, 497, 498, 524, 525, 526, 527, 528, 529, 555, 556, 557, 558, 559, 560, 586, 587, 588, 589, 590, 591, 616, 617, 618, 619, 620, 621, 622, 647, 648, 649, 650, 651, 652, 653, 678, 679, 680, 681, 682, 683, 684, 709, 710, 711, 712, 713, 714, 715, 739, 740, 741, 742, 743, 744, 745, 746, 770, 771, 772, 773, 774, 775, 776, 777, 801, 802, 803, 804, 805, 806, 807, 808, 832, 833, 834, 835, 836, 837, 838, 839, 862, 863, 864, 865, 866, 867, 868, 869, 870, 893, 894, 895, 896, 897, 898, 899, 900, 901, 924, 925, 926, 927, 928, 929, 930, 931, 932, 955, 956, 957, 958, 959, 960] outside the applicability limits [-2, 2] and will be set to NaN.
pmv_valid = valid_range(pmv, (-2, 2))
2. PMV ASHRAE 55#
The ASHRAE 55 PMV model uses the same psychrometric axes but applies slightly different applicability limits. Running both models side by side makes the differences in their valid regions visible.
fig, (ax0, ax1) = plt.subplots(1, 2, figsize=(12, 5), constrained_layout=True)
(
PsychrometricPlot(pmv_ppd_iso)
.set_x_axis("tdb", 15.0, 35.0, resolution=0.5)
.set_y_axis("hr", 0.0, 0.022, resolution=0.001)
.set_params(vr=0.10, met=1.2, clo=0.5, tr=25.0)
.set_regions(output="pmv", thresholds=[-0.5, 0.5])
.plot(ax=ax0, title="PMV ISO 7730")
).ax.set(xlabel="Dry-bulb temperature [°C]", ylabel="Humidity ratio [kg/kg]")
(
PsychrometricPlot(pmv_ppd_ashrae)
.set_x_axis("tdb", 15.0, 35.0, resolution=0.5)
.set_y_axis("hr", 0.0, 0.022, resolution=0.001)
.set_params(vr=0.10, met=1.2, clo=0.5, tr=25.0)
.set_regions(output="pmv", thresholds=[-0.5, 0.5])
.plot(ax=ax1, title="PMV ASHRAE 55")
).ax.set(xlabel="Dry-bulb temperature [°C]", ylabel="Humidity ratio [kg/kg]")
plt.show()
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:173: UserWarning: 'tdb' has 230 values [30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0] at indices [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942] outside the applicability limits [10.0, 30.0] and will be set to NaN.
tdb_valid = valid_range(tdb, (10.0, 30.0))
3. Custom Labels and Colors#
Labels and colors work the same way as in ThresholdPlot. Pass them to set_regions and they appear in the legend.
psy_custom = (
PsychrometricPlot(pmv_ppd_iso)
.set_x_axis("tdb", 15.0, 38.0, resolution=0.5)
.set_y_axis("hr", 0.0, 0.025, resolution=0.001)
.set_params(vr=0.15, met=1.4, clo=0.7, tr=25.0)
.set_regions(
output="pmv",
thresholds=[-0.5, 0.5],
labels=["Cold", "Comfort zone", "Hot"],
colors=["#A3D1FF", "#A8E6CF", "#FFB7B2"],
)
.plot(title="Psychrometric Chart — Custom Palette")
)
psy_custom.ax.set_xlabel("Dry-bulb temperature [°C]")
psy_custom.ax.set_ylabel("Humidity ratio [kg/kg]")
plt.show()
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:173: UserWarning: 'tdb' has 416 values [30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0, 30.5, 31.0, 31.5, 32.0, 32.5, 33.0, 33.5, 34.0, 34.5, 35.0, 35.5, 36.0, 36.5, 37.0, 37.5, 38.0] at indices [31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 1018, 1019, 1020, 1021, 1022, 1023, 1024, 1025, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1159, 1160, 1161, 1162, 1163, 1164, 1165, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1206, 1207, 1208, 1209, 1210, 1211, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221] outside the applicability limits [10.0, 30.0] and will be set to NaN.
tdb_valid = valid_range(tdb, (10.0, 30.0))
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:178: UserWarning: 'pmv' has 98 values [2.024176873972362, 2.055200542413765, 2.0288960384642913, 2.0861260315822756, 2.002475833611064, 2.0597242119455794, 2.116953806797207, 2.0332071501490865, 2.0904551326003395, 2.1476843304420097, 2.006575281029659, 2.063841672090308, 2.1210892599052147, 2.1783180619873925, 2.037113856091247, 2.0943798560273748, 2.1516270504469683, 2.2088554580142192, 2.0102721076287886, 2.0675565456460316, 2.124822155685698, 2.182068957945168, 2.2392969722361964, 2.0406197478136106, 2.0979038005804367, 2.155169021945926, 2.2124154332746535, 2.2696430555223386, 2.0135698737360115, 2.07087240023611, 2.1281560689583476, 2.1854209028662055, 2.242666924487798, 2.299894155919232, 2.043728361923938, 2.101030510165335, 2.158313796043162, 2.215578243704231, 2.2728238768365627, 2.3300507186730837, 2.0164720850180187, 2.0737927489287156, 2.1310945200916613, 2.188377424319637, 2.245641486939093, 2.3028867327943354, 2.3601131862515663, 2.046443180725473, 2.1037634744891958, 2.1610648697484263, 2.2183473935155287, 2.2756110722929153, 2.332855932077578, 2.3900819983654604, 2.018982193081982, 2.0763210508405066, 2.1336409756086034, 2.190941996133373, 2.2482241406230328, 2.305487436752297, 2.3627319116672583, 2.419957591990089, 2.048767632811464, 2.1061061296573156, 2.1634256865757715, 2.2207263335298895, 2.2780080999200214, 2.335271014589549, 2.3925151058300935, 2.4497404013865594, 2.021103596061418, 2.078460711724394, 2.1357988487767177, 2.1931180389861873, 2.2504183135280478, 2.30769970299109, 2.3649622373837387, 2.4222059461395915, 2.4794308581228037, 2.0507050936443623, 2.108061858754255, 2.1653996371269963, 2.2227184617628364, 2.280018365045453, 2.3372993787483995, 2.394561534041534, 2.4518048614968944, 2.509029391094422, 2.02283963918656, 2.080215084542145, 2.1375715001826134, 2.1949089209845543, 2.252227381176857, 2.3095269143478996, 2.3668075534523316, 2.424069330817855, 2.481312278151433, 2.5385364265453396] at indices [422, 469, 515, 516, 561, 562, 563, 608, 609, 610, 654, 655, 656, 657, 701, 702, 703, 704, 747, 748, 749, 750, 751, 794, 795, 796, 797, 798, 840, 841, 842, 843, 844, 845, 887, 888, 889, 890, 891, 892, 933, 934, 935, 936, 937, 938, 939, 980, 981, 982, 983, 984, 985, 986, 1026, 1027, 1028, 1029, 1030, 1031, 1032, 1033, 1073, 1074, 1075, 1076, 1077, 1078, 1079, 1080, 1119, 1120, 1121, 1122, 1123, 1124, 1125, 1126, 1127, 1166, 1167, 1168, 1169, 1170, 1171, 1172, 1173, 1174, 1212, 1213, 1214, 1215, 1216, 1217, 1218, 1219, 1220, 1221] outside the applicability limits [-2, 2] and will be set to NaN.
pmv_valid = valid_range(pmv, (-2, 2))
4. Styling and Legend Control#
Use fill_kws, line_kws, and legend_kws to adjust the appearance. legend=False removes the colour key when the chart is being combined with another plot that already carries the legend.
psy_styled = (
PsychrometricPlot(pmv_ppd_iso)
.set_x_axis("tdb", 10.0, 40.0, resolution=1.0)
.set_y_axis("hr", 0.0, 0.030, resolution=0.001)
.set_params(vr=0.10, met=1.2, clo=0.5, tr=25.0)
.set_regions(output="pmv", thresholds=[-0.5, 0.5])
.plot(
title="Psychrometric Chart — Transparent Fill",
fill_kws={"alpha": 0.55},
line_kws={"linewidth": 2.0, "color": "#333333"},
)
)
psy_styled.ax.set_xlabel("Dry-bulb temperature [°C]")
psy_styled.ax.set_ylabel("Humidity ratio [kg/kg]")
plt.show()
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:173: UserWarning: 'tdb' has 310 values [31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0] at indices [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960] outside the applicability limits [10.0, 30.0] and will be set to NaN.
tdb_valid = valid_range(tdb, (10.0, 30.0))
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:178: UserWarning: 'pmv' has 188 values [-2.8480352531149005, -2.658705298851658, -2.471022503342447, -2.2850570819839455, -2.100886451544277, -2.811866526343206, -2.6225316633410185, -2.4348444515125425, -2.2488750786559817, -2.064700934830481, -2.775813728693507, -2.5864739726860178, -2.3987823586935995, -2.212809047004443, -2.028631401054323, -2.739876303688214, -2.550531670333539, -2.3628356682645535, -2.17685843034747, -2.7040536984056107, -2.5147042032868288, -2.3270038271611373, -2.1410226755603863, -2.6683453634515115, -2.478991022077136, -2.291286285847519, -2.105301233047337, -2.632750752931166, -2.4433915807356223, -2.255682498288203, -2.069693556713189, -2.597269324421441, -2.407905336765541, -2.220191921920211, -2.034199103935701, 2.01144927033767, -2.5749568159595304, -2.372531751114676, -2.1848140176255155, 2.0468412738177935, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0821210962351895, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.117289270111753, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0095364727891525, 2.1523463246042085, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.044483825387187, 2.1872927855306443, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.079321104116445, 2.2221291753968067, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.114048828209616, 2.256856013422136, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0143271442090156, 2.148667513638799, 2.29147381556557, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.048838194134804, 2.18317767314106, 2.3259830945510873, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.083241224873996, 2.21757981624374, 2.3603843598930307, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1175367427823515, 2.2518744492895344, 2.394678117921177, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.017331191180959, 2.1517252510557485, 2.286062075461336, 2.4288648718055805, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.051414069246256, 2.185807249754786, 2.320143194806845, 2.462945121581182, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0853909319516197, 2.2197832358291714, 2.354118304262947, 2.496919364172188, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1192622731727586, 2.253653703141875, 2.3879878976798667, 2.5307880934162235, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0185808547434045, 2.1530285837224934, 2.2874191424930514, 2.421752465845099, 2.56455180008826, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.052243480858637, 2.186690351374462, 2.3210800416437536, 2.45541249650711, 2.5982109719243196, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0858020461802895, 2.2202480608866053, 2.3546368853394166, 2.4889684743988294, 2.6317660936449627, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1192570324861646, 2.2537021940244397, 2.388090155333126, 2.522420881260912, 2.6652176469785553, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0181073430082814, 2.1526089185846202, 2.287053229584112, 2.4214403304086765, 2.5557701958647985, 2.69856611068432, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.051357432433581, 2.185858180337406, 2.3203016434152404, 2.4546878864034074, 2.5890168940355514, 2.7318119605751816, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.084505367908146, 2.219005290682308, 2.3534479084435453, 2.4878332962308365, 2.6221614486744897, 2.76495566954039, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1175516194799076, 2.2520507196555566, 2.3864924946932717, 2.5208770299030854, 2.655204329781604, 2.7979977075679447] at indices [0, 1, 2, 3, 4, 31, 32, 33, 34, 35, 62, 63, 64, 65, 66, 93, 94, 95, 96, 124, 125, 126, 127, 155, 156, 157, 158, 186, 187, 188, 189, 217, 218, 219, 220, 247, 248, 249, 250, 278, 279, 280, 281, 309, 310, 311, 312, 340, 341, 342, 343, 370, 371, 372, 373, 374, 401, 402, 403, 404, 405, 432, 433, 434, 435, 436, 463, 464, 465, 466, 467, 493, 494, 495, 496, 497, 498, 524, 525, 526, 527, 528, 529, 555, 556, 557, 558, 559, 560, 586, 587, 588, 589, 590, 591, 616, 617, 618, 619, 620, 621, 622, 647, 648, 649, 650, 651, 652, 653, 678, 679, 680, 681, 682, 683, 684, 709, 710, 711, 712, 713, 714, 715, 739, 740, 741, 742, 743, 744, 745, 746, 770, 771, 772, 773, 774, 775, 776, 777, 801, 802, 803, 804, 805, 806, 807, 808, 832, 833, 834, 835, 836, 837, 838, 839, 862, 863, 864, 865, 866, 867, 868, 869, 870, 893, 894, 895, 896, 897, 898, 899, 900, 901, 924, 925, 926, 927, 928, 929, 930, 931, 932, 955, 956, 957, 958, 959, 960] outside the applicability limits [-2, 2] and will be set to NaN.
pmv_valid = valid_range(pmv, (-2, 2))
5. Using result.fig and result.ax#
result.fig and result.ax follow the same conventions as in ThresholdPlot. Use result.fig.suptitle for figure-level text or result.fig.savefig to write the chart to disk.
r = (
PsychrometricPlot(pmv_ppd_iso)
.set_x_axis("tdb", 10.0, 40.0, resolution=1.0)
.set_y_axis("hr", 0.0, 0.030, resolution=0.001)
.set_params(vr=0.10, met=1.2, clo=0.5, tr=25.0)
.set_regions(output="pmv", thresholds=[-0.5, 0.5])
.plot()
)
r.fig.suptitle(
"Comfort Assessment — Psychrometric View", y=1.03, fontsize=13, fontweight="bold"
)
r.ax.set_title("ISO 7730 | met=1.2, clo=0.5, vr=0.1 m/s", y=1.18)
r.ax.set_xlabel("Dry-bulb temperature [°C]")
r.ax.set_ylabel("Humidity ratio [kg/kg]")
# r.fig.savefig("psychrometric_pmv.png", dpi=150, bbox_inches="tight")
plt.show()
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:173: UserWarning: 'tdb' has 310 values [31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0, 31.0, 32.0, 33.0, 34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0] at indices [21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960] outside the applicability limits [10.0, 30.0] and will be set to NaN.
tdb_valid = valid_range(tdb, (10.0, 30.0))
/home/docs/checkouts/readthedocs.org/user_builds/pythermalcomfort/envs/latest/lib/python3.11/site-packages/pythermalcomfort/models/pmv_ppd_iso.py:178: UserWarning: 'pmv' has 188 values [-2.8480352531149005, -2.658705298851658, -2.471022503342447, -2.2850570819839455, -2.100886451544277, -2.811866526343206, -2.6225316633410185, -2.4348444515125425, -2.2488750786559817, -2.064700934830481, -2.775813728693507, -2.5864739726860178, -2.3987823586935995, -2.212809047004443, -2.028631401054323, -2.739876303688214, -2.550531670333539, -2.3628356682645535, -2.17685843034747, -2.7040536984056107, -2.5147042032868288, -2.3270038271611373, -2.1410226755603863, -2.6683453634515115, -2.478991022077136, -2.291286285847519, -2.105301233047337, -2.632750752931166, -2.4433915807356223, -2.255682498288203, -2.069693556713189, -2.597269324421441, -2.407905336765541, -2.220191921920211, -2.034199103935701, 2.01144927033767, -2.5749568159595304, -2.372531751114676, -2.1848140176255155, 2.0468412738177935, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0821210962351895, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.117289270111753, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0095364727891525, 2.1523463246042085, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.044483825387187, 2.1872927855306443, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.079321104116445, 2.2221291753968067, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.114048828209616, 2.256856013422136, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0143271442090156, 2.148667513638799, 2.29147381556557, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.048838194134804, 2.18317767314106, 2.3259830945510873, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.083241224873996, 2.21757981624374, 2.3603843598930307, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1175367427823515, 2.2518744492895344, 2.394678117921177, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.017331191180959, 2.1517252510557485, 2.286062075461336, 2.4288648718055805, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.051414069246256, 2.185807249754786, 2.320143194806845, 2.462945121581182, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0853909319516197, 2.2197832358291714, 2.354118304262947, 2.496919364172188, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1192622731727586, 2.253653703141875, 2.3879878976798667, 2.5307880934162235, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0185808547434045, 2.1530285837224934, 2.2874191424930514, 2.421752465845099, 2.56455180008826, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.052243480858637, 2.186690351374462, 2.3210800416437536, 2.45541249650711, 2.5982109719243196, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0858020461802895, 2.2202480608866053, 2.3546368853394166, 2.4889684743988294, 2.6317660936449627, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1192570324861646, 2.2537021940244397, 2.388090155333126, 2.522420881260912, 2.6652176469785553, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.0181073430082814, 2.1526089185846202, 2.287053229584112, 2.4214403304086765, 2.5557701958647985, 2.69856611068432, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.051357432433581, 2.185858180337406, 2.3203016434152404, 2.4546878864034074, 2.5890168940355514, 2.7318119605751816, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.084505367908146, 2.219005290682308, 2.3534479084435453, 2.4878332962308365, 2.6221614486744897, 2.76495566954039, -2.5749568159595304, -2.3667420668491945, -2.1590374640278798, 2.1175516194799076, 2.2520507196555566, 2.3864924946932717, 2.5208770299030854, 2.655204329781604, 2.7979977075679447] at indices [0, 1, 2, 3, 4, 31, 32, 33, 34, 35, 62, 63, 64, 65, 66, 93, 94, 95, 96, 124, 125, 126, 127, 155, 156, 157, 158, 186, 187, 188, 189, 217, 218, 219, 220, 247, 248, 249, 250, 278, 279, 280, 281, 309, 310, 311, 312, 340, 341, 342, 343, 370, 371, 372, 373, 374, 401, 402, 403, 404, 405, 432, 433, 434, 435, 436, 463, 464, 465, 466, 467, 493, 494, 495, 496, 497, 498, 524, 525, 526, 527, 528, 529, 555, 556, 557, 558, 559, 560, 586, 587, 588, 589, 590, 591, 616, 617, 618, 619, 620, 621, 622, 647, 648, 649, 650, 651, 652, 653, 678, 679, 680, 681, 682, 683, 684, 709, 710, 711, 712, 713, 714, 715, 739, 740, 741, 742, 743, 744, 745, 746, 770, 771, 772, 773, 774, 775, 776, 777, 801, 802, 803, 804, 805, 806, 807, 808, 832, 833, 834, 835, 836, 837, 838, 839, 862, 863, 864, 865, 866, 867, 868, 869, 870, 893, 894, 895, 896, 897, 898, 899, 900, 901, 924, 925, 926, 927, 928, 929, 930, 931, 932, 955, 956, 957, 958, 959, 960] outside the applicability limits [-2, 2] and will be set to NaN.
pmv_valid = valid_range(pmv, (-2, 2))