У меня есть фигура с 2 осями, как мне сделать, чтобы они имели одинаковый масштаб по оси Y в Matplotlib? - PullRequest
0 голосов
/ 29 января 2020

Это код. Две оси имеют две разные шкалы. (ax1 имеет как отрицательные, так и положительные значения, а ax2 имеет только отрицательные значения). График должен быть таким, чтобы у оси ax1 была одна линия (положительные точки) сверху оси x, а другая линия (с отрицательными отметками x) ниже оси x. То же самое для ax2.

Вы можете увидеть результирующий график здесь: The resultant graph is shown here

x_ax = list(np.arange(10))
y_ax = list(np.arange(-10,0))
x_ax1 = list(np.arange(10))
y_ax1 = list(np.arange(0,10))
x_ax_p = list(np.arange(10))
y_ax_p = list(np.arange(-30,-20))
x_ax1_p = list(np.arange(10))
y_ax1_p = list(np.arange(-40,-30))



fig = plt.figure(figsize = (10,10))
ax1 = fig.add_axes([0.1,0.1,0.8,0.8])
ax2 = fig.add_axes([0.9,0.1,0.8,0.8])
ax1.spines['left'].set_color('none')
# ax1.spines['right'].set_color('none')
ax1.spines['top'].set_color('none')
# ax1.spines['bottom'].set_position('zero')
# ax2.spines['left'].set_position(('axes', 0))
ax2.spines['right'].set_color('none')
ax2.spines['top'].set_color('none')
# ax2.spines['bottom'].set_position('zero')
#ax1.set_xticks([])
ax1.set_yticks([])
#ax2.set_xticks([])
ax2.set_yticks([])
x_offset= 0.2 # for displaying the values
y_offset= 2 
##################enter code here#########################
ax1.plot(range(len(x_ax)),y_ax,marker='o', label = 'Test_store')
ax1.plot(range(len(x_ax1)),y_ax1,marker='o', label = 'Control_store')

##############################################
ax2.plot(range(len(x_ax_p)),y_ax_p,marker='o', label = 'Test_store')
ax2.plot(range(len(x_ax1_p)),y_ax1_p,marker='o', label = 'Control_store')

for i,j in zip(range(len(x_ax)),y_ax):
    ax1.annotate(round(j,2),xy=(i,j),xytext = (i,j))
for i,j in zip(range(len(x_ax1)),y_ax1):
    ax1.annotate(str(round(j,2)),xy=(i,j),xytext = (i,j))
for i,j in zip(range(len(x_ax_p)),y_ax_p):
    ax2.annotate(str(round(j,2)),xy=(i,j),xytext = (i,j))
for i,j in zip(range(len(x_ax1_p)),y_ax1_p):
    ax2.annotate(str(round(j,2)),xy=(i,j),xytext = (i,j))

ax1.text(8.5, -15, 'Week', ha='right')
ax1.set_ylabel("Sales")
ax1.set_title("Period : "+ per + " "+ "\n" +"Week vs Sales")
ax2.set_title("Period : "+"Pilot Phase"+ "\n"+"Week vs Sales")
ax1.set_xticks(np.arange(len(x_ax)))
ax2.set_xticks(np.arange(len(x_ax)))
ax2.legend()
plt.show()
fig.clear()

1 Ответ

0 голосов
/ 29 января 2020

Чтобы задать одинаковые пределы по оси Y для обоих рисунков, вы можете использовать set_ylim:

ymin, ymax = 0, 100  # Change these to whatever values you require
ax1.set_ylim(ymin, ymax)
ax2.set_ylim(ymin, ymax)

Вы также можете использовать минимальное и максимальное значения по умолчанию для y-пределов, сгенерированных Matplotlib, чтобы установить пределы динамически, то есть без необходимости задавать их вручную:

ymin = min([ax1.get_ylim()[0], ax2.get_ylim()[0]])
ymax = max([ax1.get_ylim()[1], ax2.get_ylim()[1]])
ax1.set_ylim(ymin, ymax)
ax2.set_ylim(ymin, ymax)

Чтобы установить вертикальное положение отметок по оси X в ноль, вы можете использовать следующее:

ax1.spines['bottom'].set_position('zero')
ax2.spines['bottom'].set_position('zero')

Если вы хотите использовать значение, отличное от нуля, приведенное выше сокращенное обозначение:

ax1.spines['bottom'].set_position(("data", 0))
ax2.spines['bottom'].set_position(("data", 0))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...