在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$
标记的提议不是一个真正的解决方案.
如何从字符串中读取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计算基尼系数),但我得到一个奇怪的结果.对于从中采样的均匀分布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) 我正试图用tsplot
seaborn来绘制时间数据FacetGrid
.我有两个实验,"A"和"B",每个实验都有两个人(bob
和joe
)的时间过程测量,有三个重复.我希望网格的每个子图包含一个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)
这是有效的,但它没有得到正确的颜色:
怎么能纠正这个?
-
数据是data.txt
:
t name reps …
Run Code Online (Sandbox Code Playgroud) 我在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
:
我也想在中位数增加一个水平线X
和Y
。如何才能做到这一点?factorplot
似乎没有水平线选项。
我正在通过一组概率从多项分布生成绘制向量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
可能很慢).
timeit
说 The 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
我想用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
参数?并没有重新调整情节?画布上有足够的空间来贴合标签和子图.
如何在没有任何统计数据的情况下在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)
将计算此处不相关的统计数据.
我尝试根据此示例(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 ×9
matplotlib ×6
numpy ×3
seaborn ×3
scipy ×2
bar-chart ×1
optimization ×1
pandas ×1
statistics ×1