我试图在matplotlib中复制以下图像,似乎是我唯一的选择.虽然看起来你不能堆叠barh图,所以我不知道该怎么做

如果你知道一个更好的python库来绘制这种东西,请告诉我.
这就是我可以想到的一切:
import matplotlib.pyplot as plt; plt.rcdefaults()
import numpy as np
import matplotlib.pyplot as plt
people = ('A','B','C','D','E','F','G','H')
y_pos = np.arange(len(people))
bottomdata = 3 + 10 * np.random.rand(len(people))
topdata = 3 + 10 * np.random.rand(len(people))
fig = plt.figure(figsize=(10,8))
ax = fig.add_subplot(111)
ax.barh(y_pos, bottomdata,color='r',align='center')
ax.barh(y_pos, topdata,color='g',align='center')
ax.set_yticks(y_pos)
ax.set_yticklabels(people)
ax.set_xlabel('Distance')
plt.show()
Run Code Online (Sandbox Code Playgroud)
然后我必须使用ax.text单独添加标签,这将是乏味的.理想情况下,我只想指定要插入的部分的宽度,然后用我选择的字符串更新该部分的中心.外面的标签(例如3800)我可以稍后添加自己,它主要是条形部分本身的标签,并以一种很好的方式创建这个堆叠的方法我遇到了问题.你甚至可以用任何方式指定"距离"即颜色范围吗?

我有一个更新矩阵A的循环,我想让它变为openmp但我不确定应该共享哪些变量和私有.我本以为只有ii和jj会起作用,但事实并非如此.我想我也需要一个!$ OMP ATOMIC UPDATE ...
循环只计算N和N-1粒子之间的距离并更新矩阵A.
!$OMP PARALLEL DO PRIVATE(ii,jj)
do ii=1,N-1
do jj=ii+1,N
distance_vector=X(ii,:)-X(jj,:)
distance2=sum(distance_vector*distance_vector)
distance=DSQRT(distance2)
coff=distance*distance*distance
PE=PE-M(II)*M(JJ)/distance
A(jj,:)=A(jj,:)+(M(ii)/coff)*(distance_vector)
A(ii,:)=A(ii,:)-(M(jj)/coff)*(distance_vector)
end do
end do
!$OMP END PARALLEL DO
Run Code Online (Sandbox Code Playgroud) 我使用以下函数创建了以下一组子图:
def create31fig(size,xlabel,ylabel,title=None):
fig = plt.figure(figsize=(size,size))
ax1 = fig.add_subplot(311)
ax2 = fig.add_subplot(312)
ax3 = fig.add_subplot(313)
plt.subplots_adjust(hspace=0.001)
plt.subplots_adjust(wspace=0.001)
ax1.set_xticklabels([])
ax2.set_xticklabels([])
xticklabels = ax1.get_xticklabels()+ ax2.get_xticklabels()
plt.setp(xticklabels, visible=False)
ax1.set_title(title)
ax2.set_ylabel(ylabel)
ax3.set_xlabel(xlabel)
return ax1,ax2,ax3
Run Code Online (Sandbox Code Playgroud)
如何确保子图(312)的顶部和底部不与其邻居重叠?谢谢.

我在Fortran中写了一个矩阵,如下所示:
real(kind=kind(0.0d0)), dimension(256,256,256) :: dense
[...CALCULATION...]
inquire(iolength=reclen)dense
open(unit=8,file=fname,&
form='unformatted',access='direct',recl=reclen)
write(unit=8,rec=1)dense(:,:,:)
close(unit=8)
Run Code Online (Sandbox Code Playgroud)
我想把它读回Python.我见过的所有东西都是2D NxN阵列而不是3D阵列.在Matlab中我可以读作:
fid = fopen(nfilename,'rb');
mesh_raw = fread(fid,ndim*ndim*ndim,'double');
fclose(fid);
mesh_reshape = reshape(mesh_raw,[ndim ndim ndim]);
Run Code Online (Sandbox Code Playgroud)
我只需要Python中的等价物 - 可能有一个类似的加载/重塑工具可用.如果有一个更友好的紧凑方式来写出来让Python理解,我愿意接受建议.它可能看起来像这样:.我只是不熟悉我的情况的等效语法.一个很好的参考就足够了.谢谢.
此操作需要尽可能快地应用为包含数百万个元素的实际数组.这是问题的简单版本.
所以,我有一个随机数组的独特整数(通常是数百万个元素).
totalIDs = [5,4,3,1,2,9,7,6,8 ...]
我有另一个数组(通常是成千上万)独特的整数,我可以创建一个掩码.
subsampleIDs1 = [5,1,9]
subsampleIDs2 = [3,7,8]
subsampleIDs3 = [2,6,9]
...
Run Code Online (Sandbox Code Playgroud)
我可以用numpy来做
mask = np.in1d(totalIDs,subsampleIDs,assume_unique = True)
然后我可以使用掩码提取我想要的另一个数组的信息(比如第0列包含我想要的那个).
variable = allvariables [mask] [:,0]
既然ID在两个阵列中都是唯一的,那么有没有办法显着提高速度.构建与数百万个ID(totalIDs)匹配的几千个点(subsampleIDs)的掩码需要很长时间.
我曾经想过要经历一次并写出一个索引的二进制文件(以加快未来的搜索).
for i in range(0,3):
mask = np.in1d(totalIDs,subsampleIDs,assume_unique=True)
index[mask] = i
Run Code Online (Sandbox Code Playgroud)
其中X在subsampleIDsX中.然后我可以这样做:
for i in range(0,3):
if index[i] == i:
rowmatch = i
break
variable = allvariables[rowmatch:len(subsampleIDs),0]
Run Code Online (Sandbox Code Playgroud)
对?但这也很慢,因为在循环中有一个条件来找到它第一次匹配时.有没有更快的方法来查找数字首次出现在有序数组中,因此条件不会减慢循环?
我有一堆数据分散x,y.如果我想根据x将它们分开并将误差条等于它们的标准偏差,我将如何去做呢?
我在python中唯一知道的是循环遍历x中的数据并根据bin(max(X)-min(X)/ nbins)对它们进行分组,然后循环遍历这些块以找到std.我确信有更快的方法可以用numpy做到这一点.
我希望它看起来类似于"vert symmetric":http://matplotlib.org/examples/pylab_examples/errorbar_demo.html
在NxM子图的面板中是否有任何方法只显示左列和底行的轴.
A|N|N|N
A|N|N|N
A|N|N|N
A|A|A|A
Run Code Online (Sandbox Code Playgroud)
其中A =轴,N =无轴
有时我的子图是10x8,3x4,4x9等,它们都有相同的x和y轴.我只是希望它出现在该子集的最左侧和最底层.目前我必须知道它正在绘制哪个轴和做什么
if (figi-1) % 7 != 0:
ax.set_yticklabels([])
if figi < 29:
ax1.set_xticklabels([])
Run Code Online (Sandbox Code Playgroud)
我希望将此概括为任何NxM面板布置,而无需事先了解.谢谢.
编辑:我找到了一种方法来做y轴.我使用以下方法设置了面板的数量:
nwide = 12
nhigh = 5
Run Code Online (Sandbox Code Playgroud)
这意味着我可以做到
if (figi-1) % nwide != 0:
ax.set_yticklabels([])
Run Code Online (Sandbox Code Playgroud)
最底层的想法?
编辑:解决了.x轴如下:
if figi < (nwide*nhigh) - nwide:
ax.set_xticklabels([])
Run Code Online (Sandbox Code Playgroud) 假设我有一个NxNxN数组,我想创建一个堆叠每个方向的平均数组.xy(z平均),xz(y平均),yz(x平均)
对于xy,我会这样做:
np.mean(data,axis=1, dtype=np.float64)
Run Code Online (Sandbox Code Playgroud)
我只是使用axis = 1 [或2或3]将它堆叠在每个方向上吗?
假设我有一个Nx3的数组,我想要满足的元素说:
4 < col1 < 13, 5 > col2 > 3, 10 > col3 > 6
Run Code Online (Sandbox Code Playgroud)
即应用于:
1,2,3
4,5,6
9,4,7
Run Code Online (Sandbox Code Playgroud)
然后它将提供一个Mx3数组,它只包含满足所有三个条件的行.对于上面的例子,它输出
9,4,7
Run Code Online (Sandbox Code Playgroud)
我想过做一个循环,但我认为numpy或类似的东西必须有更快的东西(例如np.where?)
假设我想建立粒子数据的直方图,该直方图在某个 bin 范围 nbin 上进行平滑。现在我有 5 个包含不同质量粒子的数据集(每组 x,y 具有不同的质量)。通常,粒子位置的直方图是一个简单的情况(使用 numpy):
heatmap, xedges, yedges = np.histogram2d(x, y, bins=nbin)
extent = [xedges[0], xedges[-1], yedges[0], yedges[-1]]
heatmap = np.flipud(np.rot90(heatmap))
ax.imshow(heatmap, extent=extent)
Run Code Online (Sandbox Code Playgroud)
但是,如果我想添加下一批粒子,它们具有不同的质量,因此密度也会不同。有没有办法通过某个常数对直方图进行加权,以便绘制的热图能够真实地表示密度,而不仅仅是粒子总数的分箱?
我知道“权重”是一个特征,但是否只是设置weights = m_i,其中m_i是每个数据集1-5的粒子质量?