英文:
How to put labels between axis values and add a second Y axis
问题
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
state_palette = list((sns.color_palette("Spectral_r", 5).as_hex()))
action_palette = list((sns.color_palette("Spectral_r", 4).as_hex()))
# create data for E=0.1 Sigmoid/Golabi States
x = ['0.2', '0.5', '0.6', '0.7', '0.8', '0.9', '1.0 \n (Linear model)']
states = np.c_[st_02, st_05, st_06, st_07, st_08, st_09, st_10]
# plot bars in stack manner
plt.figure(figsize=(6, 18))
plt.subplot(8, 1, 8)
#y1
plt.bar(x, states[0], label='State 1', color=state_palette[0])
plt.bar(x, states[1], bottom=states[0], label='State 2', color=state_palette[1])
plt.bar(x, states[2], bottom=states[0]+states[1], label='State 3', color=state_palette[2])
plt.bar(x, states[3], bottom=states[0]+states[1]+states[2], label='State 4', color=state_palette[3])
plt.bar(x, states[4], bottom=states[0]+states[1]+states[2]+states[3], label='State 5', color=state_palette[4])
plt.gca().invert_xaxis()
plt.ylim([0, 8])
plt.ylabel('Fraction of states')
plt.xlabel('Economies of scale parameter, b')
# Adding the second Y-axis
ax = plt.gca().twinx()
ax.set_ylim([0, 1])
ax.set_ylabel('Fraction of states (normalized)')
plt.legend(bbox_to_anchor=(0, 1.02, 1, 0.2), loc="lower left", mode="expand", borderaxespad=0, ncol=3)
plt.show()
英文:
I have a numpy 2d-array from which I generate the following graph.
Stacked 8 year state distribution for different parameter b
The graph basically explains how system takes 5 states over 8 time intervals for different system parameter b.
It is a bit confusing because fractions go from 0 to 8 which isn't entirely correct. I want the fractions to go from 0 to 1 and then another Y axis that specifies the year. Basically correctly label the graph so new readers don't get confused.
How do I go about it?
Code attached below. I think I could have looped through the data but it is what it is...
Data
import numpy as np
st_02 = np.array( [[0.00000000e+00, 0.00000000e+00, 3.00000000e-01, 3.00000000e-01, 4.00000000e-01],
[3.97179162e-01, 9.99999998e-09, 1.49999990e-01, 3.90000000e-01, 6.28208384e-02],
[5.09153766e-01, 1.58871677e-01, 1.34153757e-01, 1.04999974e-01, 9.28208264e-02],
[1.52746140e-01, 2.35435852e-01, 3.03484421e-01, 1.88681959e-01, 1.19651568e-01],
[4.58238520e-02, 1.08185636e-01, 3.23255031e-01, 3.72735451e-01, 1.50000033e-01],
[1.37471656e-02, 2.33919697e-01, 3.57054740e-01, 2.45278398e-01, 1.50000033e-01],
[4.12415968e-03, 2.66515660e-01, 3.85409213e-01, 1.93950958e-01, 1.50000000e-01],
[3.00000000e-01, 5.49528058e-02, 1.55510049e-01, 3.89537165e-01, 1.00000000e-01]] ).reshape((40,1))
act_02 = np.array( [[3.02820848e-01, 0.00000000e+00, 3.00000000e-01, 3.97179152e-01],
[6.09999990e-01, 0.00000000e+00, 9.99999998e-09, 3.90000000e-01],
[8.95000027e-01, 0.00000000e+00, 1.04999974e-01, 0.00000000e+00],
[5.07833560e-01, 3.03484421e-01, 1.88681959e-01, 0.00000000e+00],
[3.04009522e-01, 0.00000000e+00, 6.95990482e-01, 0.00000000e+00],
[3.97666896e-01, 0.00000000e+00, 6.02333138e-01, 0.00000000e+00],
[4.95560235e-01, 0.00000000e+00, 3.54439755e-01, 1.50000000e-01],
[1.00000002e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]] ).reshape((32,1))
st_05 = np.array( [[0.00000000e+00, 0.00000000e+00, 3.00000000e-01, 3.00000000e-01, 4.00000000e-01],
[3.97179162e-01, 9.99999998e-09, 1.49999990e-01, 3.90000000e-01, 6.28208384e-02],
[5.09153766e-01, 1.58871677e-01, 1.34153757e-01, 1.04999974e-01, 9.28208264e-02],
[1.52746140e-01, 2.35435852e-01, 3.03484421e-01, 1.88681959e-01, 1.19651568e-01],
[4.58238520e-02, 1.08185636e-01, 3.23255031e-01, 3.72735451e-01, 1.50000033e-01],
[1.37471656e-02, 2.33919697e-01, 3.57054740e-01, 2.45278398e-01, 1.50000033e-01],
[4.12415968e-03, 2.66515660e-01, 3.85409213e-01, 1.93950958e-01, 1.50000000e-01],
[3.00000000e-01, 5.49528058e-02, 1.55510049e-01, 3.89537165e-01, 1.00000000e-01]] ).reshape((40,1))
act_05 = np.array( [[3.02820848e-01, 0.00000000e+00, 3.00000000e-01, 3.97179152e-01],
[6.09999990e-01, 0.00000000e+00, 9.99999998e-09, 3.90000000e-01],
[8.95000027e-01, 0.00000000e+00, 1.04999974e-01, 0.00000000e+00],
[5.07833560e-01, 3.03484421e-01, 1.88681959e-01, 0.00000000e+00],
[3.04009522e-01, 0.00000000e+00, 6.95990482e-01, 0.00000000e+00],
[3.97666896e-01, 0.00000000e+00, 6.02333138e-01, 0.00000000e+00],
[4.95560235e-01, 0.00000000e+00, 3.54439755e-01, 1.50000000e-01],
[1.00000002e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]] ).reshape((32,1))
st_06 = np.array( [[1.00000000e-08, 1.00000000e-08, 3.00000000e-01, 3.00000000e-01, 3.99999980e-01],
[3.99999993e-01, 1.60000000e-08, 1.33743840e-01, 3.69679758e-01, 9.65763937e-02],
[4.89679778e-01, 1.60000010e-01, 1.33374292e-01, 9.36206777e-02, 1.23325152e-01],
[1.46903944e-01, 2.27871923e-01, 2.93689650e-01, 1.81534423e-01, 1.50000000e-01],
[1.02809113e-01, 1.04335972e-01, 2.82777081e-01, 3.60077804e-01, 1.50000010e-01],
[3.90920537e-01, 2.31657098e-01, 2.06555160e-01, 2.08672044e-02, 1.50000010e-01],
[1.17276161e-01, 3.26632740e-01, 3.47239376e-01, 5.88517223e-02, 1.50000000e-01],
[3.00000000e-01, 1.12237023e-01, 1.89735546e-01, 2.98027461e-01, 1.00000000e-01]] ).reshape((40,1))
act_06 = np.array( [[3.40640469e-01, 0.00000000e+00, 2.59359551e-01, 3.99999980e-01],
[6.30320226e-01, 0.00000000e+00, 1.60000000e-08, 3.69679758e-01],
[9.06379232e-01, 0.00000000e+00, 9.36206777e-02, 0.00000000e+00],
[7.59727597e-01, 0.00000000e+00, 1.81534423e-01, 5.87379200e-02],
[3.57145095e-01, 0.00000000e+00, 2.82777081e-01, 3.60077804e-01],
[7.72577646e-01, 0.00000000e+00, 2.27422364e-01, 0.00000000e+00],
[6.81573667e-01, 0.00000000e+00, 1.68426333e-01, 1.50000000e-01],
[1.00000003e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00]] ).reshape((32,1))
st_07 = np.array( [[1.00000000e-08, 1.00017172e-08, 3.00000000e-01, 3.00000000e-01, 3.99999980e-01],
[3.99999993e-01, 1.60003434e-08, 1.20731694e-01, 3.53414616e-01, 1.25853675e-01],
[4.73414624e-01, 1.60000010e-01, 1.32073187e-01, 8.45121789e-02, 1.50000000e-01],
[2.95048729e-01, 2.21365842e-01, 2.51231702e-01, 1.32600008e-01, 9.97536896e-02],
[8.85146287e-02, 1.62292670e-01, 2.99497287e-01, 2.99695354e-01, 1.50000020e-01],
[3.26249753e-01, 2.47562768e-01, 2.43728915e-01, 3.24584740e-02, 1.50000010e-01],
[9.78749359e-02, 3.26249814e-01, 3.56887552e-01, 6.89876479e-02, 1.50000000e-01],
[3.00000000e-01, 1.04399947e-01, 1.85196960e-01, 3.10403093e-01, 1.00000000e-01]] ).reshape((40,1))
act_07 = np.array( [[0.37317078, 0., 0.22682924, 0.39999998],
[0.64658538, 0., 0., 0.35341462],
[0.84697567, 0., 0., 0.15302433],
[0.86739996, 0., 0.13260001, 0. ],
[0.40080732, 0., 0.29949729, 0.29969535],
[0.72381253, 0., 0.27618739, 0. ],
[0.66201817, 0., 0.18798178, 0.15 ],
[1., 0., 0., 0. ]] ).reshape((32,1))
st_08 = np.array( [[1.00000000e-08, 2.00005688e-08, 3.00000000e-01, 3.00000000e-01, 3.99999980e-01],
[6.06666639e-01, 1.80001138e-08, 3.00000050e-02, 2.19333347e-01, 1.44000009e-01],
[4.01333361e-01, 2.42666649e-01, 1.84999993e-01, 2.09999971e-02, 1.50000000e-01],
[2.33199972e-01, 2.09066664e-01, 2.84499987e-01, 1.80133315e-01, 9.31000126e-02],
[6.99600015e-02, 1.35093342e-01, 2.95903305e-01, 3.49043302e-01, 1.50000010e-01],
[3.70031303e-01, 2.32544662e-01, 2.20405317e-01, 2.70186583e-02, 1.50000000e-01],
[1.79407247e-01, 1.94521463e-01, 2.72576730e-01, 2.03494530e-01, 1.50000000e-01],
[3.00000000e-01, 1.10667201e-01, 1.86841779e-01, 3.02491020e-01, 1.00000000e-01]] ).reshape((40,1))
act_08 = np.array( [[0.39333338, 0., 0., 0.60666663],
[0.78066667, 0., 0., 0.21933335],
[0.88720003, 0., 0., 0.11279997],
[0.81986664, 0., 0.18013331, 0. ],
[0.35505335, 0., 0.2959033, 0.3490433 ],
[0.93160209, 0., 0., 0.06839785],
[0.57682169, 0., 0.27317828, 0.15 ],
[1., 0., 0., 0. ]] ).reshape((32,1))
st_09 = np.array( [[0., 0., 0.3, 0.3, 0.39999998],
[0.60000003, 0., 0.02999999, 0.22000001, 0.15 ],
[0.406, 0.24, 0.18299999, 0.02099998, 0.15 ],
[0.17729999, 0.21040001, 0.28409999, 0.17819998, 0.15 ],
[0.27785663, 0.11300001, 0.20784001, 0.25130335, 0.15000001],
[0.33466034, 0.25844667, 0.23429301, 0.02259995, 0.15 ],
[0.1567521, 0.18555348, 0.28371522, 0.2239792, 0.15 ],
[0.3, 0.09981155, 0.21590587, 0.28428259, 0.1 ]] ).reshape((40,1))
act_09 = np.array( [[0.40000001, 0., 0., 0.59999997],
[0.77400003, 0., 0., 0.226 ],
[0.94449999, 0., 0., 0.05549998],
[0.77533334, 0., 0., 0.22466663],
[0.54085665, 0., 0.20784001, 0.25130335],
[0.93159647, 0., 0.01204951, 0.05635399],
[0.6740841, 0., 0.07294154, 0.25297436],
[1.00000001, 0., 0., 0. ]] ).reshape((32,1))
st_10 = np.array( [[1.00000000e-08, 1.00000000e-08, 3.00000000e-01, 3.00000000e-01, 3.99999980e-01],
[5.99999982e-01, 5.99998334e-09, 2.99999990e-02, 2.19999993e-01, 1.50000000e-01],
[3.89999986e-01, 2.40000004e-01, 1.82999988e-01, 3.69999916e-02, 1.50000000e-01],
[1.86899986e-01, 2.04000005e-01, 2.79300007e-01, 1.79800002e-01, 1.50000000e-01],
[2.81270038e-01, 1.15559985e-01, 2.06399990e-01, 2.46769997e-01, 1.50000000e-01],
[3.60351005e-01, 1.35620022e-01, 1.74356992e-01, 1.79671981e-01, 1.50000000e-01],
[1.42976700e-01, 1.71264396e-01, 2.78781796e-01, 2.56977077e-01, 1.50000000e-01],
[3.00000000e-01, 9.14435692e-02, 2.13814032e-01, 2.94742399e-01, 1.00000000e-01]] ).reshape((40,1))
act_10 = np.array( [[0.40000003, 0., 0., 0.59999997],
[0.79, 0., 0., 0.20999998],
[0.93009999, 0., 0., 0.06989998],
[0.77480001, 0., 0., 0.22519999],
[0.72403003, 0., 0., 0.27596998],
[0.78545663, 0., 0.17967198, 0.03487139],
[0.64218250, 0., 0.10071049, 0.25710698],
[1., 0., 0., 0. ]] ).reshape((32,1))
Plotting
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
state_palette = list((sns.color_palette("Spectral_r", 5).as_hex()))
action_palette = list((sns.color_palette("Spectral_r", 4).as_hex()))
# create data for E=0.1 Sigmoid/Golabi States
x = ['0.2', '0.5', '0.6', '0.7', '0.8', '0.9', '1.0 \n (Linear model)']
states = np.c_[st_02, st_05, st_06, st_07, st_08, st_09, st_10]
# plot bars in stack manner
plt.figure(figsize=(6.5,14))
#y1
plt.bar(x, states[0], label = 'State 1', color= state_palette[0])
plt.bar(x, states[1], bottom=states[0], label = 'State 2', color= state_palette[1])
plt.bar(x, states[2], bottom=states[0]+states[1], label = 'State 3', color= state_palette[2])
plt.bar(x, states[3], bottom=states[0]+states[1]+states[2], label = 'State 4', color= state_palette[3])
plt.bar(x, states[4], bottom=states[0]+states[1]+states[2]+states[3], label = 'State 5', color= state_palette[4])
#y2
plt.bar(x, states[5], bottom= 1, color= state_palette[0])
plt.bar(x, states[6], bottom= 1+ states[5], color= state_palette[1])
plt.bar(x, states[7], bottom= 1+ states[5]+states[6], color= state_palette[2])
plt.bar(x, states[8], bottom= 1+ states[5]+states[6]+states[7], color= state_palette[3])
plt.bar(x, states[9], bottom= 1+ states[5]+states[6]+states[7]+states[8], color= state_palette[4])
#y3
plt.bar(x, states[10], bottom= 2, color= state_palette[0])
plt.bar(x, states[11], bottom= 2+ states[10], color= state_palette[1])
plt.bar(x, states[12], bottom= 2+ states[10]+states[11], color= state_palette[2])
plt.bar(x, states[13], bottom= 2+ states[10]+states[11]+states[12], color= state_palette[3])
plt.bar(x, states[14], bottom= 2+ states[10]+states[11]+states[12]+states[13], color= state_palette[4])
#y4
plt.bar(x, states[15], bottom= 3, color= state_palette[0])
plt.bar(x, states[16], bottom= 3+ states[15], color= state_palette[1])
plt.bar(x, states[17], bottom= 3+ states[15]+states[16], color= state_palette[2])
plt.bar(x, states[18], bottom= 3+ states[15]+states[16]+states[17], color= state_palette[3])
plt.bar(x, states[19], bottom= 3+ states[15]+states[16]+states[17]+states[18], color= state_palette[4])
#y5
plt.bar(x, states[20], bottom= 4, color= state_palette[0])
plt.bar(x, states[21], bottom= 4+ states[20], color= state_palette[1])
plt.bar(x, states[22], bottom= 4+ states[20]+states[21], color= state_palette[2])
plt.bar(x, states[23], bottom= 4+ states[20]+states[21]+states[22], color= state_palette[3])
plt.bar(x, states[24], bottom= 4+ states[20]+states[21]+states[22]+states[23], color= state_palette[4])
#y6
plt.bar(x, states[25], bottom= 5, color= state_palette[0])
plt.bar(x, states[26], bottom= 5+ states[25], color= state_palette[1])
plt.bar(x, states[27], bottom= 5+ states[25]+states[26], color= state_palette[2])
plt.bar(x, states[28], bottom= 5+ states[25]+states[26]+states[27], color= state_palette[3])
plt.bar(x, states[29], bottom= 5+ states[25]+states[26]+states[27]+states[28], color= state_palette[4])
#y7
plt.bar(x, states[30], bottom= 6, color= state_palette[0])
plt.bar(x, states[31], bottom= 6+ states[30], color= state_palette[1])
plt.bar(x, states[32], bottom= 6+ states[30]+states[31], color= state_palette[2])
plt.bar(x, states[33], bottom= 6+ states[30]+states[31]+states[32], color= state_palette[3])
plt.bar(x, states[34], bottom= 6+ states[30]+states[31]+states[32]+states[33], color= state_palette[4])
#y8
plt.bar(x, states[35], bottom= 7, color= state_palette[0])
plt.bar(x, states[36], bottom= 7+ states[35], color= state_palette[1])
plt.bar(x, states[37], bottom= 7+ states[35]+states[36], color= state_palette[2])
plt.bar(x, states[38], bottom= 7+ states[35]+states[36]+states[37], color= state_palette[3])
plt.bar(x, states[39], bottom= 7+ states[35]+states[36]+states[37]+states[38], color= state_palette[4])
plt.gca().invert_xaxis()
plt.legend(bbox_to_anchor=(0, 1.02, 1, 0.2), loc="lower left", mode="expand", borderaxespad=0, ncol=3)
plt.xlabel('Economies of scale parameter, b')
plt.ylabel('Fraction of states')
plt.axhline(y = 1, color = 'k', linestyle = '-')
plt.axhline(y = 2, color = 'k', linestyle = '-')
plt.axhline(y = 3, color = 'k', linestyle = '-')
plt.axhline(y = 4, color = 'k', linestyle = '-')
plt.axhline(y = 5, color = 'k', linestyle = '-')
plt.axhline(y = 6, color = 'k', linestyle = '-')
plt.axhline(y = 7, color = 'k', linestyle = '-')
plt.axhline(y = 8, color = 'k', linestyle = '-')
plt.ylim([0,8])
#plt.savefig('Transient_state_distribution_PWL.png', transparent=True, dpi = 144)
plt.show()
EDIT 1:
I created subplots but I cannot add 2nd Y axis on the other side. It requires to have fig, axs = plt.subplot()
kind of definition.
Here's updated code.
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
state_palette = list((sns.color_palette("Spectral_r", 5).as_hex()))
action_palette = list((sns.color_palette("Spectral_r", 4).as_hex()))
# create data for E=0.1 Sigmoid/Golabi States
x = ['0.2', '0.5', '0.6', '0.7', '0.8', '0.9', '1.0 \n (Linear model)']
states = np.c_[st_02, st_05, st_06, st_07, st_08, st_09, st_10]
actions = np.c_[act_02, act_05, act_06, act_07, act_08, act_09, act_10]
# plot bars in stack manner
plt.figure(figsize=(6,18))
plt.subplot(8, 1, 8)
#y1
plt.bar(x, states[0], label = 'State 1', color= state_palette[0])
plt.bar(x, states[1], bottom=states[0], label = 'State 2', color= state_palette[1])
plt.bar(x, states[2], bottom=states[0]+states[1], label = 'State 3', color= state_palette[2])
plt.bar(x, states[3], bottom=states[0]+states[1]+states[2], label = 'State 4', color= state_palette[3])
plt.bar(x, states[4], bottom=states[0]+states[1]+states[2]+states[3], label = 'State 5', color= state_palette[4])
plt.gca().invert_xaxis()
plt.ylim([0,1])
plt.yticks([0, 1])
plt.xlabel('Economies of scale parameter, b')
plt.subplot(8, 1, 7)
#y2
plt.bar(x, states[5], bottom= 0, color= state_palette[0])
plt.bar(x, states[6], bottom= 0+ states[5], color= state_palette[1])
plt.bar(x, states[7], bottom= 0+ states[5]+states[6], color= state_palette[2])
plt.bar(x, states[8], bottom= 0+ states[5]+states[6]+states[7], color= state_palette[3])
plt.bar(x, states[9], bottom= 0+ states[5]+states[6]+states[7]+states[8], color= state_palette[4])
plt.gca().invert_xaxis()
plt.ylim([0,1])
plt.xticks([])
plt.yticks([0, 1])
plt.subplot(8, 1, 6)
#y3
plt.bar(x, states[10], bottom= 0, color= state_palette[0])
plt.bar(x, states[11], bottom= 0+ states[10], color= state_palette[1])
plt.bar(x, states[12], bottom= 0+ states[10]+states[11], color= state_palette[2])
plt.bar(x, states[13], bottom= 0+ states[10]+states[11]+states[12], color= state_palette[3])
plt.bar(x, states[14], bottom= 0+ states[10]+states[11]+states[12]+states[13], color= state_palette[4])
plt.gca().invert_xaxis()
plt.ylim([0,1])
plt.xticks([])
plt.yticks([0, 1])
plt.subplot(8, 1, 5)
#y4
plt.bar(x, states[15], bottom= 0, color= state_palette[0])
plt.bar(x, states[16], bottom= 0+ states[15], color= state_palette[1])
plt.bar(x, states[17], bottom= 0+ states[15]+states[16], color= state_palette[2])
plt.bar(x, states[18], bottom= 0+ states[15]+states[16]+states[17], color= state_palette[3])
plt.bar(x, states[19], bottom= 0+ states[15]+states[16]+states[17]+states[18], color= state_palette[4])
plt.gca().invert_xaxis()
plt.ylim([0,1])
plt.xticks([])
plt.yticks([0, 1])
plt.subplot(8, 1, 4)
#y5
plt.bar(x, states[20], bottom= 0, color= state_palette[0])
plt.bar(x, states[21], bottom= 0+ states[20], color= state_palette[1])
plt.bar(x, states[22], bottom= 0+ states[20]+states[21], color= state_palette[2])
plt.bar(x, states[23], bottom= 0+ states[20]+states[21]+states[22], color= state_palette[3])
plt.bar(x, states[24], bottom= 0+ states[20]+states[21]+states[22]+states[23], color= state_palette[4])
plt.gca().invert_xaxis()
plt.ylim([0,1])
plt.xticks([])
plt.yticks([0, 1])
plt.subplot(8, 1, 3)
#y6
plt.bar(x, states[25], bottom= 0, color= state_palette[0])
plt.bar(x, states[26], bottom= 0+ states[25], color= state_palette[1])
plt.bar(x, states[27], bottom= 0+ states[25]+states[26], color= state_palette[2])
plt.bar(x, states[28], bottom= 0+ states[25]+states[26]+states[27], color= state_palette[3])
plt.bar(x, states[29], bottom= 0+ states[25]+states[26]+states[27]+states[28], color= state_palette[4])
plt.gca().invert_xaxis()
plt.ylim([0,1])
plt.xticks([])
plt.yticks([0, 1])
plt.subplot(8, 1, 2)
#y7
plt.bar(x, states[30], bottom= 0, color= state_palette[0])
plt.bar(x, states[31], bottom= 0+ states[30], color= state_palette[1])
plt.bar(x, states[32], bottom= 0+ states[30]+states[31], color= state_palette[2])
plt.bar(x, states[33], bottom= 0+ states[30]+states[31]+states[32], color= state_palette[3])
plt.bar(x, states[34], bottom= 0+ states[30]+states[31]+states[32]+states[33], color= state_palette[4])
plt.gca().invert_xaxis()
plt.ylim([0,1])
plt.xticks([])
plt.yticks([0, 1])
plt.subplot(8, 1, 1)
#y8
plt.bar(x, states[35], bottom= 0, color= state_palette[0], label = 'State 1')
plt.bar(x, states[36], bottom= 0+ states[35], color= state_palette[1], label = 'State 2')
plt.bar(x, states[37], bottom= 0+ states[35]+states[36], color= state_palette[2], label = 'State 3')
plt.bar(x, states[38], bottom= 0+ states[35]+states[36]+states[37], color= state_palette[3], label = 'State 4')
plt.bar(x, states[39], bottom= 0+ states[35]+states[36]+states[37]+states[38], color= state_palette[4], label = 'State 5')
plt.legend(bbox_to_anchor=(0, 1.02, 1, 0.2), loc="lower left", mode="expand", borderaxespad=0, ncol=3)
plt.gca().invert_xaxis()
plt.xticks([])
plt.ylim([0,1])
plt.yticks([0, 1])
plt.subplots_adjust(wspace=0, hspace=0.175)
plt.tick_params(labelcolor="none", bottom=False, left=False)
#plt.savefig('Transient_state_distribution_PWL.png', transparent=True, dpi = 144)
plt.show()
答案1
得分: 1
-
我认为如果使用
pandas
,代码会更简洁且易于阅读。pandas.DataFrme.plot
API在绘制分组或堆叠条形图时效率更高。- 不包括数据数组,原始代码中有大约105行代码。使用
pandas
选项可将其减少到36行代码(不包括空格),更容易扩展。
-
对于标签:
- 使用
fig
标签fig.supxlabel
fig.supylabel
fig.suptitle
- 根据原始代码,使用
ax = plt.gca()
和ax_right = ax.twinx()
,然后使用ax_right.set_ylabel(...)
。 - 使用以下代码可以在右侧y轴上绘制:
ax.yaxis.set_label_position('right')
.set_ylabel
具有labelpad
参数来更改位置以适应坐标轴边界框。
- 使用
-
- 如果只创建一个图(没有子图),那么使用隐式的“pyplot”接口是可以的,否则应该使用显式的“Axes”接口。
- 在显式和隐式命令之间切换是不良做法,尽管有很多答案这样做。
-
在
python 3.11.2
、pandas 2.0.1
、matplotlib 3.7.1
中测试通过
英文:
- I think the code will be more concise, and easier to read if
pandas
is used.- The
pandas.DataFrme.plot
API is much more efficient at plotting grouped or stacked bars. - Not including the arrays for the data, there are currently about 105 lines of code in the OP. Using the
pandas
option reduces that to 36 lines of code (not including blank spaces), which scales more easily.
- The
- For labels:
- Use
fig
labelsfig.supxlabel
fig.supylabel
fig.suptitle
- Given the code in the OP, use
ax = plt.gca()
andax_right = ax.twinx()
, and thenax_right.set_ylabel(...)
. - With the following code you plot on the right y-axis with
ax.yaxis.set_label_position('right')
.set_ylabel
has thelabelpad
parameter the change the position from the Axes bounding box.
- Use
- Please refer to the Matplotlib Application Interfaces (APIs)
- If you are creating one plot (no subplots), then it's okay to use the implicit "pyplot" interface, otherwise you should use the explicit "Axes" interface.
- It is bad practice to switch between explicit and implicit commands, though there are many answers doing so.
- Tested in
python 3.11.2
,pandas 2.0.1
,matplotlib 3.7.1
import pandas as pd
import matplotlib.pyplot as plt
# stack the data
states = np.c_[st_02, st_05, st_06, st_07, st_08, st_09, st_10]
# create a dataframe from states
df_st = pd.DataFrame(states)
# split the dataframe into 5 row chunks
n = 5
list_st = [df_st[i:i+n].reset_index(drop=True) for i in range(0, df_st.shape[0], n)]
state_palette = list((sns.color_palette("Spectral_r", 5).as_hex()))
# create the figure and axes
fig, axes = plt.subplots(nrows=len(list_st), figsize=(6, 18), sharex=True, gridspec_kw={'hspace': 0.1, 'wspace': 0})
# reverse the axes based on the preferred display options
axes = axes[::-1]
# years labels
years = range(2015, 2024)
# iterate through each axes and it's associated data
for ax, data, year in zip(axes, list_st, years):
# transpose the dataframe and then reverse the column order
data = data.T[::-1]
# set the index labels (e.g. the x-axis)
data.index = ['1.0 \n (Linear model)', '0.9', '0.8', '0.7', '0.6', '0.5', '0.2']
# set the column names (e.g. the legend labels)
data.columns = [f'State {i}' for i in range(1, 6)]
# plot the data on the axes
data.plot(kind='bar', stacked=True, ax=ax, legend=False, width=0.85, ec='k', rot=0, yticks=[0, 1], color=state_palette)
# right y-axis label
ax.yaxis.set_label_position('right')
ax.set_ylabel(f'Year: {year}', rotation=-90, labelpad=15)
# remove x-ticks on all but the bottom axes
if ax != axes[0]:
ax.tick_params(bottom=False)
# create a legend for the top axes
if ax == axes[-1]:
ax.legend(bbox_to_anchor=(0, 1.02, 1, 0.2), loc='lower left', mode='expand', borderaxespad=0, ncol=3)
fig.supxlabel('Economies of scale parameter, b', y=0.06)
fig.supylabel('Fractions of States')
fig.suptitle('The Figure Title', y=0.93)
- Using
ax.twinx
...
# plot the data on the axes
data.plot(kind='bar', stacked=True, ax=ax, legend=False, width=0.85, ec='k', rot=0, yticks=[0, 1], color=state_palette)
# remove ax.yaxis.set_label_position('right')
# remove ax.set_ylabel(f'Year: {year}', rotation=-90, labelpad=15)
# set the left y-axis label
ax.set_ylabel('Range', labelpad=0)
# using twinx to add a right y-axis label
ax_right = ax.twinx()
ax_right.set_ylabel(f'Year: {year}', rotation=-90, labelpad=15)
ax_right.set_yticks([], []) # remove the right yticks and yticklabels
...
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论