小编Gri*_*iff的帖子

matplotlib中的堆栈条形图并为每个部分添加标签(和建议)

我试图在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)我可以稍后添加自己,它主要是条形部分本身的标签,并以一种很好的方式创建这个堆叠的方法我遇到了问题.你甚至可以用任何方式指定"距离"即颜色范围吗?

在此输入图像描述

python matplotlib

12
推荐指数
2
解决办法
3万
查看次数

不确定openmp循环中应该是SHARED还是PRIVATE

我有一个更新矩阵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)

parallel-processing fortran loops openmp

11
推荐指数
1
解决办法
2万
查看次数

删除matplotlib中子图上的重叠刻度线

我使用以下函数创建了以下一组子图:

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)的顶部和底部不与其邻居重叠?谢谢.

插曲

python plot matplotlib

10
推荐指数
1
解决办法
7812
查看次数

如何将输出的fortran二进制NxNxN矩阵读入Python

我在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理解,我愿意接受建议.它可能看起来像这样:.我只是不熟悉我的情况的等效语法.一个很好的参考就足够了.谢谢.

python binary fortran numpy matrix

7
推荐指数
1
解决办法
2549
查看次数

比numpy的in1d掩码函数更好:有序数组?

此操作需要尽可能快地应用为包含数百万个元素的实际数组.这是问题的简单版本.

所以,我有一个随机数组的独特整数(通常是数百万个元素).

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)

对?但这也很慢,因为在循环中有一个条件来找到它第一次匹配时.有没有更快的方法来查找数字首次出现在有序数组中,因此条件不会减慢循环?

python sorting performance numpy mask

7
推荐指数
1
解决办法
1750
查看次数

将散布数据转换为带有等于标准偏差的误差条的分箱数据

我有一堆数据分散x,y.如果我想根据x将它们分开并将误差条等于它们的标准偏差,我将如何去做呢?

我在python中唯一知道的是循环遍历x中的数据并根据bin(max(X)-min(X)/ nbins)对它们进行分组,然后循环遍历这些块以找到std.我确信有更快的方法可以用numpy做到这一点.

我希望它看起来类似于"vert symmetric":http://matplotlib.org/examples/pylab_examples/errorbar_demo.html

python numpy scatter histogram

5
推荐指数
1
解决办法
1万
查看次数

仅制作左子图和底部子图(在MxN面板中)包含x和y轴标签

在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)

python axes matplotlib

5
推荐指数
1
解决办法
933
查看次数

获得x,y,z,通过3D数据阵列表示

假设我有一个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]将它堆叠在每个方向上吗?

python arrays numpy matrix mean

5
推荐指数
1
解决办法
281
查看次数

提取Nx3阵列的特定行,从而每列满足条件

假设我有一个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?)

python arrays numpy

5
推荐指数
1
解决办法
456
查看次数

使用不同的权重创建堆叠的二维直方图

假设我想建立粒子数据的直方图,该直方图在某个 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的粒子质量?

python numpy histogram

5
推荐指数
1
解决办法
4108
查看次数