簡體   English   中英

雙軸上的刻度和標簽

[英]Ticks and Labels on Twin Axes

如何在額外的軸上設置標簽?

所有 4 個軸上的刻度和標簽應相同。 我做錯了什么...謝謝!

import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True

plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax3 = ax1.twiny()
plt.show()

# create reusable ticks and labels
ticks = [0,1/2,3.14159/4,3.14159/2,1]
labels = [r"$0$", r"$\displaystyle\frac{1}{2}$", r"$\displaystyle\frac{\pi}{4}$", r"$\displaystyle\frac{\pi}{2}$", r"$1$"]

# Version 1: twinx() + xaxis.set_ticks()
plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax3 = ax1.twiny()
ax1.xaxis.set_ticks(ticks, labels=labels)
ax1.yaxis.set_ticks(ticks, labels=labels)
ax2.xaxis.set_ticks(ticks, labels=labels)
ax3.yaxis.set_ticks(ticks, labels=labels)
plt.show()

# Version 2: twinx() + set_xticklabels)()
plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax3 = ax1.twiny()
ax1.set_xticks(ticks)
ax1.set_xticklabels(labels)
ax1.set_yticks(ticks)
ax1.set_yticklabels(labels)
ax2.set_xticks(ticks)
ax2.set_xticklabels(labels)
ax3.set_yticks(ticks)
ax3.set_yticklabels(labels)
plt.show()

在此處輸入圖像描述

困惑:為什么ax1既有xaxis又有yaxis,而ax2、ax3卻沒有?

基於matplotlib.axes.Axes.twinx的不直觀的解決方案:

創建一個新的軸,其中包含一個不可見的 x 軸和一個與原始軸相反的獨立 y 軸(即在右側)。

這意味着不直觀(至少對我而言)您必須在.twin調用中切換 x/y。

  • 不直觀地不涉及一般的 matplotlib twinx 功能,而是涉及這樣的手動刻度和 label 分配

  • 為了進一步強調這一點,我在代碼中使用了ax2_xax3_y

免責聲明:不確定添加數據時是否會破壞您的 plot 意圖。

  • 可能至少您必須特別注意這些雙軸的數據分配 - 牢記“軸切換”。
  • 在為 x/y 軸分配不同的刻度和標簽時,還要記住那個軸開關。

但現在我認為這就是您正在尋找的 plot :

在此處輸入圖像描述

代碼:

import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True


# create reusable ticks and labels
ticks = [0,1/2,3.14159/4,3.14159/2,1]
labels = [r"$0$", r"$\displaystyle\frac{1}{2}$", r"$\displaystyle\frac{\pi}{4}$", r"$\displaystyle\frac{\pi}{2}$", r"$1$"]



plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()

ax1.xaxis.set_ticks(ticks, labels=labels)
ax1.yaxis.set_ticks(ticks, labels=labels)


ax2_x = ax1.twiny()  # switch
ax3_y = ax1.twinx()  # switch

ax2_x.xaxis.set_ticks(ticks, labels=labels) 
ax3_y.yaxis.set_ticks(ticks, labels=labels)

plt.show()

或切換x/yaxis.set_ticks - 效果相同:

  • 再想一想,我認為這是首選的方法,尤其是當數據發揮作用時
ax2_x = ax1.twinx()
ax3_y = ax1.twiny()
    
ax2_x.yaxis.set_ticks(ticks, labels=labels)  # switch
ax3_y.xaxis.set_ticks(ticks, labels=labels)  # switch

如果您不打算使用雙軸功能(這意味着為這些軸分配具有不同縮放比例的不同數據)但“只”想要所有 4 軸上的刻度和標簽以獲得更好的 plot 可讀性

基於ImportanceOfBeingErnest 答案的解決方案具有相同的 plot 結果:

import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True


# create reusable ticks and labels
ticks = [0,1/2,3.14159/4,3.14159/2,1]
labels = [r"$0$", r"$\displaystyle\frac{1}{2}$", r"$\displaystyle\frac{\pi}{4}$", r"$\displaystyle\frac{\pi}{2}$", r"$1$"]


plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()

ax1.xaxis.set_ticks(ticks, labels=labels)
ax1.yaxis.set_ticks(ticks, labels=labels)
ax1.tick_params(axis="x", bottom=True, top=True, labelbottom=True, labeltop=True)
ax1.tick_params(axis="y", left=True, right=True, labelleft=True, labelright=True)

plt.show()

ax2 = ax1.twinx()ax1共享 x 軸。
ax3 = ax1.twiny()ax1共享 y 軸。
因此,您設置ax2.xaxisax3.yaxis的刻度和刻度標簽的兩行與您已經在ax1上應用的更改是多余的。


import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = False # My computer doesn't have LaTeX, don't mind me. 

# Create reusable ticks and labels.
ticks = [0, 1/2, 3.14159/4, 3.14159/2, 1]
labels = [r"$0$", r"$\frac{1}{2}$", r"$\frac{\pi}{4}$", r"$\frac{\pi}{2}$", r"$1$"]

# Set the ticks and ticklabels for each axis.
fig = plt.figure(figsize=(5,5))
ax1 = fig.add_subplot()
ax2 = ax1.twinx()
ax3 = ax1.twiny()
for axis in (ax1.xaxis,
             ax1.yaxis,
             ax2.yaxis,
             ax3.xaxis):
    axis.set_ticks(ticks)
    axis.set_ticklabels(labels)
fig.show()

在此處輸入圖像描述

請注意,如果我注釋掉關於ax2ax3的工作,我們就會得到您在問題中的確切內容:


for axis in (ax1.xaxis, ax1.yaxis,
             # ax2.yaxis,
             # ax3.xaxis,
            ):
    axis.set_ticks(ticks)
    axis.set_ticklabels(labels)

在此處輸入圖像描述

現在讓我們通過修改ax2來破壞ax1 ,只是為了表明雙胞胎之間的界限運作良好:

ax2.xaxis.set_ticks(range(10))
ax2.xaxis.set_ticklabels(tuple("abcdefghij"))

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM