【问题标题】:How to adjust bar's widht of 3D bar graph using matplot lib如何使用 matplotlib 调整 3D 条形图的条宽
【发布时间】:2017-05-14 13:51:26
【问题描述】:

如何调整条形图条的宽度。这篇文章附上了一张图片,显示了实际情况。正如我们可以看到的标签,显示年份,从 2011 年到 2015 年。

我正在寻找一种解决方案来减小沿 y 轴的各个条的宽度。我尝试了许多随机解决方案,这些解决方案可以在线获取,但没有任何效果。

给定的图像实际上是 3D 图形,但由于视图清晰,仅显示了 2D 图片。

请帮忙:

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm

data = np.array([[0,6,3,0,0,0,0,0,0,0,0,2,2,3,0,2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,2,2,0,0,0,0,0,0,0,2],
                 [3,3,5,3,3,0,0,0,0,0,0,0,0,0,3,4,0,0,4,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2,0,2,0,0],
                 [0,0,7,5,0,10,5,0,0,0,2,0,0,0,0,0,0,0,2,0,0,0,2,4,3,3,2,0,0,0,0,0,3,2,3,2,3,0,0,0,0,0,0,0,0,3,0],
                 [0,0,0,4,0,2,3,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,0,0],
                 [5,0,2,2,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,2,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0], ])

#data = data.transpose()

row_names = ['Ch','Bi','Ba','Ho','Ja','Pu','N','Ga','Ke','Ma','Me','Ti','Ka','Th','Di','Wa','Ha','My','Tu','Ma','Bi','Ut Ka','Ra','Da','Ch','Ko','B','Bid','Gu','D&N','Ra','Pu','San','Dhu','Jal','Gon','Gand','Alw','Jal','SAS','Gur','Pat','Hos','Lu','Pan','Kur','Jan']


column_names = ["2011","2012","2013","2014","2015"]



fig = plt.figure()
ax = Axes3D(fig)


xpos = np.arange(0,lx,1)    
ypos = np.arange(0,ly,1)
xpos, ypos = np.meshgrid(xpos+0.5, ypos+0.5)

xpos = xpos.flatten()  
ypos = ypos.flatten()
zpos = np.ones(lx*ly)*1e-10

dx = 1. * np.ones_like(zpos)
dy = dx.copy()
dz = data.flatten()
print dz
cs = ['r', 'g', 'b', 'y', 'c'] * ly

values = np.linspace(0.2, 1., xpos.ravel().shape[0])
colors = cm.rainbow(values)

ticksx = np.arange(1, len(row_names)+1,1)
plt.xticks(ticksx, row_names)

z_data = np.random.rand(0,10)

ticksy = np.arange(0.5, len(column_names),1)
plt.yticks(ticksy, column_names)

#ax.tick_params(width=2, colors='r')



ax.w_xaxis.set_ticklabels(row_names,rotation=90,size=12)

ax.w_yaxis.set_ticklabels(column_names,rotation=40,size=12)

ax.bar3d(xpos,ypos,zpos, dx, dy, dz,   alpha=0.7, zsort='max',color=colors)
plt.ion()

plt.show()
raw_input(" " )

更新: 将“dx”值从 1 减少到 0.5,减少了条形宽度,但现在它显示了条形之间的巨大填充,我想完全删除。

最后更新: 我又附上了一张图片。我期待这种 3D 条形图具有减小的条形宽度(完成),并最小化条形之间的间隙。

【问题讨论】:

标签: python matplotlib matplotlib-basemap mplot3d


【解决方案1】:

呼叫签名或bar3d

ax.bar3d(xpos,ypos,zpos, dx, dy, dz,...)

其中dxdy 是条的宽度和深度。因此,通过向dx 提供不同的数组或数字来更改宽度。例如。要拥有 0.5 宽的条,请使用

ax.bar3d(..., dx=0.5, ...)

如果你想改变轴的宽度,你可以查看this question。在这里实现这个解决方案,

ax.bar3d(xpos,ypos,zpos, 1, 1, dz,   alpha=0.7, zsort='max',color=colors)
ax.get_proj = lambda: np.dot(Axes3D.get_proj(ax), np.diag([1,0.4, 1, 1]))

会给出:

【讨论】:

  • 嘿,这是一个很好的解决方案,当我将值更改 0.5 时起作用。但是现在仍然存在一个问题,它显示了减小的条形宽度但两个条形之间的巨大填充是否有任何方法可以减小我尝试使用 set_padding 的填充大小但它不起作用。我又更新了一张图片。谢谢
  • 没有填充!如果dx1,则条形为一年,如果dx 小于1,则条形为一年的一小部分。你能准确解释一下你想要的情节应该是什么样子吗?
  • 正如您在第二张图片中看到的那样,条形之间有一个拥抱间隙,我想消除这个间隙,条形应该没有间隙地相互连接
  • 是的,要消除这个差距,使用原来的大小写,其中dx = 1
  • 但是使用原来的case bar尺寸会再次增加。我又发布了一张,可能是最后一张图片(使用 power point cut 和过去创建),它显示了我对 matplotlib 的期望。
猜你喜欢
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多