gpt4 book ai didi

python - 将 3D 条形图置于 matplotlib 中给定位置的中心

转载 作者:行者123 更新时间:2023-12-01 09:01:51 24 4
gpt4 key购买 nike

考虑带有自定义网格线的 3D 条形图:

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.ticker import MultipleLocator
# This import registers the 3D projection, but is otherwise unused.
from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import

fig = plt.figure(figsize=(20, 10))
ax = fig.add_subplot(111, projection='3d')

ax.xaxis.set_major_locator(MultipleLocator(1))
ax.yaxis.set_major_locator(MultipleLocator(1))
ax.zaxis.set_major_locator(MultipleLocator(2))

nx = 10
ny = 10

colors = cm.tab20(np.linspace(0, 1, nx))
width = depth = 0.1

for x in np.arange(nx):
for y in np.arange(ny):
ax.bar3d(x, y, 0, width, depth, x+y, shade=False, color = colors[x], edgecolor = 'black')

plt.show()

3D bar plot example

如何放置条形图,使条形图在 xy 平面中网格线相互交叉的位置居中?

我正在考虑类似的事情

ax.bar3d(x+0.5*depth, y+0.5*width, ...)

只是我不清楚 matplotlib 使用的偏移量是什么。它应该适用于所有深度宽度值。

对于 2D 条形图,有一个参数,align = 'center',但它似乎不适用于 3D。

最佳答案

在您看来,坐标的移动实际上只是投影与轴边距的结合。因此,即使条形图正确定位在其中心,它们看起来也会发生偏移,并且该偏移量取决于轴的大小、视角等。

这个问题的解决方案原则上在这个问答中给出: Removing axes margins in 3D plot

您可以通过减去条形宽度的一半来使条形居中,并添加一个补丁来删除 z 轴的边距。然后将 z 下限设置为 0 将条固定到网格上,并使它们在任何视角下都看起来居中。

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
from matplotlib.ticker import MultipleLocator
from mpl_toolkits.mplot3d import Axes3D
from mpl_toolkits.mplot3d.axis3d import Axis

def _get_coord_info_new(self, renderer):
mins, maxs, cs, deltas, tc, highs = self._get_coord_info_old(renderer)
correction = deltas * [0,0,1.0/4]
mins += correction
maxs -= correction
return mins, maxs, cs, deltas, tc, highs
if not hasattr(Axis, "_get_coord_info_old"):
Axis._get_coord_info_old = Axis._get_coord_info
Axis._get_coord_info = _get_coord_info_new


fig = plt.figure(figsize=(20, 10))
ax = fig.add_subplot(111, projection='3d')

ax.xaxis.set_major_locator(MultipleLocator(1))
ax.yaxis.set_major_locator(MultipleLocator(1))
ax.zaxis.set_major_locator(MultipleLocator(2))

nx = 10
ny = 10

colors = cm.tab20(np.linspace(0, 1, nx))
width = depth = 0.1

for x in np.arange(nx):
for y in np.arange(ny):
ax.bar3d(x-width/2., y-depth/2., 0, width, depth, x+y, shade=False,
color = colors[x], edgecolor = 'black')

ax.set_zlim(0,None)

plt.show()

enter image description here

关于python - 将 3D 条形图置于 matplotlib 中给定位置的中心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52402049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com