【发布时间】:2022-01-19 17:05:55
【问题描述】:
目标是在绘制pcolormesh 和scatter 时修改xticklabel。
但是,我无法访问现有的 xtick 标签。
简单
ax = plt.axes()
labels_x = [item.get_text() for item in ax.get_xticklabels()]
生产的:
['', '', '', '', '', '']
或
fig.canvas.draw()
xticks = ax.get_xticklabels()
生产的:
['', '', '', '', '', '']
不返回对应的标签。
我能否知道如何正确访问 plt 案例的轴刻度标签。
为了可读性,我将代码分成两部分。
- 生成用于绘图的数据的第一部分
- 第二部分处理绘图
第 1 部分:生成用于绘图的数据
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import math
np.random.seed(0)
increment=120
max_val=172800
aran=np.arange(0,max_val,increment).astype(int)
arr=np.concatenate((aran.reshape(-1,1), np.random.random((aran.shape[0],4))), axis=1)
df=pd.DataFrame(arr,columns=[('lapse',''),('a','i'),('a','j'),('b','k'),('c','')])
ridx=df.index[df[('lapse','')] == 3600].tolist()[0]+1 # minus 1 so to allow 3600 start at new row
df[('event','')]=0
df.loc[[1,2,3,10,20,30],[('event','')]]=1
arr=df[[('a','i'),('event','')]].to_numpy()
col_len=ridx
v=arr[:,0].view()
nrow_size=math.ceil(v.shape[0]/col_len)
X=np.pad(arr[:,0].astype(float), (0, nrow_size*col_len - arr[:,0].size),
mode='constant', constant_values=np.nan).reshape(nrow_size,col_len)
mask_append_val=0 # This value must equal to 1 for masking
arrshape=np.pad(arr[:,1].astype(float), (0, nrow_size*col_len - arr[:,1].size),
mode='constant', constant_values=mask_append_val).reshape(nrow_size,col_len)
第 2 节绘图
fig = plt.figure(figsize=(8,6))
plt.pcolormesh(X,cmap="plasma")
x,y = X.shape
xs,ys = np.ogrid[:x,:y]
# the non-zero coordinates
u = np.argwhere(arrshape)
plt.scatter(ys[:,u[:,1]].ravel()+.5,xs[u[:,0]].ravel()+0.5,marker='*', color='r', s=55)
plt.gca().invert_yaxis()
xlabels_to_use_this=df.loc[:30,[('lapse','')]].values.tolist()
# ax = plt.axes()
# labels_x = [item.get_text() for item in ax.get_xticklabels()]
# labels_y = [item.get_text() for item in ax.get_yticklabels()]
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.title("Plot 2D array")
plt.colorbar()
plt.tight_layout()
plt.show()
预期输出
【问题讨论】:
-
请描述具体问题是什么:您返回的刻度值是什么?提及您需要刻度值的目标也很有用。
-
好吧,随着更多数据添加到绘图中,xtick 位置仍然会发生很大变化。您可以强制平局,但推荐的解决方案是您自己决定在哪里打勾,然后致电
ax.set_xticks(your_ticks)。请注意,“plt案例”与ax = plt.gca()案例完全相同。在内部两者都做同样的事情。例如,您可以使用plt.xticks(range(len(xlabels_to_use_this)), xlabels_to_use_this)。请注意,将刻度设置为尝试接收刻度都应在您的代码中尽可能晚地发生,因为许多绘图命令都会更改刻度。 -
另请注意
ax = plt.axes()在您现有的绘图之上创建一个新的虚拟绘图。你真的应该避免这种情况。请改用ax = plt.gca()来访问现有的子图。获得正确刻度的首选方法是使用plt.pcolormesh(x-values, y-values, color-values, ...) -
感谢@JohanC 的详细解释,也许我理解了一些东西,但仍然使用 ax = plt.gca() 后跟 labels_x = [item.get_text() 作为 ax.get_xticklabels()] 中的项目产量
['', '', '', '', '', '', '', ''] -
您的代码中没有设置任何 xtick 标签。它们仅在“显示”时间显示,并使用类似于代码格式化程序 (docs) 的东西。你可以得到
plt.gca().get_xticks()。但更好的是,您将ax.set_xticks(...)与ax.set_xticklabels(...)一起使用。随着所有的重塑,您的代码非常难以理解。此外,颜色条需要一个参数。例如。mesh = plt.pcolormesh(...)和plt.colorbar(mesh, ....)
标签: python matplotlib