小编mvd*_*mvd的帖子

如何制作在matplotlib中循环的箭头?

在matplotlib中绘制一个循环回指向其原点的箭头的正确方法是什么?我试过了:

plt.figure()
plt.xlim([0, 1])
plt.ylim([0, 1])
plt.annotate("", xy=(0.6, 0.9),
             xycoords="figure fraction",
             xytext = (0.6, 0.8),
             textcoords="figure fraction",
             fontsize = 10, \
             color = "k",
             arrowprops=dict(edgecolor='black',
                             connectionstyle="angle,angleA=-180,angleB=45",
                             arrowstyle = '<|-',
                             facecolor="k",
                             linewidth=1,
                             shrinkA = 0,
                             shrinkB = 0))
plt.show()
Run Code Online (Sandbox Code Playgroud)

这没有给出正确的结果:

箭头

connectionstyle从这个页面很难理解这些论点(http://matplotlib.org/users/annotations_guide.html).

我正在寻找的是像这样这样:

循环箭头

更新:链接的答案没有显示如何使用plt.annotate其他功能我想使用.使用$\circlearrowleft$标记的提议不是一个真正的解决方案.

python matplotlib

10
推荐指数
2
解决办法
2320
查看次数

如何从字符串中读取numpy 2D数组?

如何从字符串中读取numpy数组?拿一个字符串:

[[ 0.5544  0.4456], [ 0.8811  0.1189]]
Run Code Online (Sandbox Code Playgroud)

并将其转换为数组:

a = from_string("[[ 0.5544  0.4456], [ 0.8811  0.1189]]")
Run Code Online (Sandbox Code Playgroud)

哪里a成为对象:np.array([[0.5544, 0.4456], [0.8811, 0.1189]])

更新:

我正在寻找一个非常简单的界面.一种将2D数组(浮点数)转换为字符串然后再读取它们以重建数组的方法:

arr_to_string(array([[0.5544, 0.4456], [0.8811, 0.1189]])) 应该回来 "[[ 0.5544 0.4456], [ 0.8811 0.1189]]"

string_to_arr("[[ 0.5544 0.4456], [ 0.8811 0.1189]]") 应该返回对象 array([[0.5544, 0.4456], [0.8811, 0.1189]])

理想情况下,如果arr_to_string有一个精度参数来控制转换为字符串的浮点精度,那么你就不会得到像这样的条目0.4444444999999999999999999.

我无法在numpy docs中找到这两种方式.np.save让你创建一个字符串但是没有办法重新加载它(np.load只适用于文件.)

python numpy scipy

8
推荐指数
3
解决办法
9561
查看次数

在Python/numpy中计算基尼系数

我正在计算基尼系数(类似于:Python - 使用Numpy计算基尼系数),但我得到一个奇怪的结果.对于从中采样的均匀分布np.random.rand(),基尼系数为0.3,但我预计它将接近于0(完全相等).这里出了什么问题?

def G(v):
    bins = np.linspace(0., 100., 11)
    total = float(np.sum(v))
    yvals = []
    for b in bins:
        bin_vals = v[v <= np.percentile(v, b)]
        bin_fraction = (np.sum(bin_vals) / total) * 100.0
        yvals.append(bin_fraction)
    # perfect equality area
    pe_area = np.trapz(bins, x=bins)
    # lorenz area
    lorenz_area = np.trapz(yvals, x=bins)
    gini_val = (pe_area - lorenz_area) / float(pe_area)
    return bins, yvals, gini_val

v = np.random.rand(500)
bins, result, gini_val = G(v)
plt.figure()
plt.subplot(2, 1, 1)
plt.plot(bins, result, …
Run Code Online (Sandbox Code Playgroud)

python statistics numpy

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

如何在Python的seaborn中使用带有FacetGrid的tsplot?

我正试图用tsplotseaborn来绘制时间数据FacetGrid.我有两个实验,"A"和"B",每个实验都有两个人(bobjoe)的时间过程测量,有三个重复.我希望网格的每个子图包含一个tsplot给定的实验(其中每个人获得不同的颜色,其中置信区间来自重复.数据在下面.

代码是:

import matplotlib.pylab as plt
import seaborn as sns
import pandas

df = pandas.read_csv("./data.txt", sep="\t")
sns.set(style="ticks", color_codes=True)
plt.figure()
g = sns.FacetGrid(df, col="t", hue="name", row="experiment")
g = g.map(sns.tsplot, time="t", value="val", unit="reps",
          condition="name")
plt.show()
Run Code Online (Sandbox Code Playgroud)

它给出了错误:TypeError: tsplot() takes at least 1 argument (5 given).

如何正确绘制?

更新:

我发现这需要map_dataframe.我的新代码是:

g = sns.FacetGrid(df, row="experiment")
g = g.map_dataframe(sns.tsplot, time="t", unit="reps",
                    value="val", condition="name")
Run Code Online (Sandbox Code Playgroud)

这是有效的,但它没有得到正确的颜色:

颜色没有出现在带有facetgrid的tsplot中

怎么能纠正这个?

-

数据是data.txt:

t   name    reps …
Run Code Online (Sandbox Code Playgroud)

python matplotlib pandas seaborn

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

使用带状图在seaborn中用中线绘制点

我在seaborn中有以下情节:

df = pandas.DataFrame({"sample": ["X", "X", "X", "Y", "Y", "Y"],
                       "value": [0.2, 0.3, 0.4, 0.7, 0.75, 0.8],
                       "rep": ["a", "b", "c", "a", "b", "c"]})
plt.figure()
ax = sns.stripplot(x="sample", y="value", edgecolor="none",
                   hue="sample", palette="Set1", data=df)

# how to plot median line?
plt.show()
Run Code Online (Sandbox Code Playgroud)

它以灰度颜色绘制点而不是使用Set1并且仅显示X在图例中而不是Y

秒

我也想在中位数增加一个水平线XY。如何才能做到这一点?factorplot似乎没有水平线选项。

python matplotlib seaborn

3
推荐指数
1
解决办法
7890
查看次数

加速Python/NumPy中的多项随机样本

我正在通过一组概率从多项分布生成绘制向量probs,其中每个绘制是probs选择的条目的索引:

import numpy as np
def sample_mult(K, probs):
    result = np.zeros(num_draws, dtype=np.int32)
    for n in xrange(K):
        draws = np.random.multinomial(1, probs)
        result[n] = np.where(draws == 1)[0][0]
    return result
Run Code Online (Sandbox Code Playgroud)

这可以加快吗?np.random.multinomial一遍又一遍地调用似乎效率低下(也np.where可能很慢).

timeitThe slowest run took 6.72 times longer than the fastest. This could mean that an intermediate result is being cached 100000 loops, best of 3: 18.9 µs per loop

python optimization numpy vectorization scipy

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

如何在不更改绘图的情况下更改matplotlib中的图形画布大小?

我想用matplotlib中的面板标签("A","B",......")来标注我正在制作的图表.例如,我想要注释一组带有大"A"的子图.图中的左上角如下面的代码所示.如何更改图形画布以使此"A"可见?

f = plt.figure(figsize=(5,5))
plt.subplot(2, 2, 1)
# this "A" is clipped in the plot
plt.annotate("A",
             xy = (-0.25, 1.1),
             xytext = (-0.25, 1.1),
             xycoords = 'axes fraction',
             textcoords = 'axes fraction',
             fontsize=30)
plt.subplot(2, 2, 2)
plt.subplot(2, 2, 3)
plt.subplot(2, 2, 4)
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)

如何通过增加子图周围的填充来为文本标签腾出空间?

有没有办法在子图的左侧添加"填充",以便将它们推到图的右侧,而不更改figsize参数?并没有重新调整情节?画布上有足够的空间来贴合标签和子图.

python matplotlib

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

使用旋转的xlabels绘制Seaborn Python中的条形图

如何在没有任何统计数据的情况下在Seaborn中绘制简单的条形图?数据集只是名称和值.

import pandas
df = pandas.DataFrame({"name": ["Bob Johnson", "Mary Cramer", "Joe Ellis"], "vals": [1,2,3]})
Run Code Online (Sandbox Code Playgroud)

我想将此绘制为条形图,其中xlabels从name列和y轴值中拉出,vals并使x轴标签旋转45度.怎么做到呢?使用sns.barplot像:

sns.barplot(x="name", y="vals", data=df)
Run Code Online (Sandbox Code Playgroud)

将计算此处不相关的统计数据.

python matplotlib bar-chart seaborn

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

如何指定箭头坐标

我尝试根据此示例(http://matplotlib.org/examples/pylab_examples/arrow_simple_demo.html)在matplotlib中绘制从(0.1,0.5)到(0.5,0.5)的箭头:

f = plt.figure()
ax = plt.subplot(2, 1, 1)
plt.xlim([0, 1])
plt.ylim([0, 1])
ax.arrow(0.1, 0.5, 0.5, 0.5,
         head_width=0.05,
         head_length=0.1,
         fc='k',
         ec='k',
         clip_on=False)
plt.show()
Run Code Online (Sandbox Code Playgroud)

这应该会产生一个水平箭头,但由于某种原因,它给出了一个不以 (0.5,0.5) 结尾的倾斜箭头。这里出了什么问题?

python matplotlib

0
推荐指数
1
解决办法
2220
查看次数