Dav*_*ave 4 python plot axes matplotlib
也许我让标题比问题更复杂,但这里是......!
我有一些在 xy 平面上连续的角度数据,跨越 360 => 0 度线 - 即 358,359,0,1,2...
如果我正在绘制这些并设置:
plt.xlim(0,360)
Run Code Online (Sandbox Code Playgroud)
当然,我会在图的最左边有三个点,在最右边有两个点。您可以在此处的(更复杂且实际的)图中看到这一点(故意颠倒了 x 轴限制):

我真正想要的是将所有点绘制在绘图窗口中相同位置的周围,也许朝向绘图的中心。在此方案下,x 轴向 360-0 度边界左侧减小,向右增大。
我不想对数据本身进行任何翻译/转换(这是一个大型数据集等),所以我希望通过一些 matplotlib 技巧来做到这一点。
我计划用 hexbin 绘制数据点,如果这有什么区别的话。
感谢您的浏览,并预先感谢您的帮助,
戴夫
老实说,我认为仅转换数据就会快得多。x[x>180] -= 360是相当快的。除非您的数据集大小为几 GB,否则转换数据所需的时间仅为几毫秒。
因此,这是一个简单的方法(转换数据):
import matplotlib.pyplot as plt
import numpy as np
# Generate data to match yours...
y = 60 * np.random.random(300) - 20
x = 60 * (np.random.random(300) - 0.5)
x[x < 0] += 360
# Transform the data back to a -180 to 180 range...
x[x > 180] -= 360
# Plot the data
fig, ax = plt.subplots()
ax.plot(x, y, 'b.')
# Set the ticks so that negative ticks represent >180 numbers
ticks = ax.get_xticks()
ticks[ticks < 0] += 360
ax.set_xticklabels([int(tick) for tick in ticks])
plt.show()
Run Code Online (Sandbox Code Playgroud)

但是,如果您想避免转换数据,您可以执行以下操作...不过,这 100% 保证比仅转换数据要慢。(可能会慢一点,但不会更快。)
import matplotlib.pyplot as plt
import numpy as np
# Generate data to match yours...
y = 60 * np.random.random(300) - 20
x = 60 * (np.random.random(300) - 0.5)
x[x < 0] += 360
fig, (ax1, ax2) = plt.subplots(ncols=2, sharey=True)
fig.subplots_adjust(wspace=0)
ax1.spines['right'].set_visible(False)
ax2.spines['left'].set_visible(False)
ax1.tick_params(right=False)
ax2.tick_params(left=False)
for label in ax2.get_yticklabels():
label.set_visible(False)
ax1.plot(x[x > 180], y[x > 180], 'b.')
ax2.plot(x[x <= 180], y[x <= 180], 'b.')
ax2.set_xticks(ax2.get_xticks()[1:])
plt.show()
Run Code Online (Sandbox Code Playgroud)

| 归档时间: |
|
| 查看次数: |
1937 次 |
| 最近记录: |