关于在ggplot2中使用阴影区域的帖子有一些 ,但我认为没有完全回答我的问题.我有两个斜坡用于跨越多个条件的线,我想遮蔽它们之间的区域.这是示例数据:
dat <- data.frame(cond1=c("a","a","b","b"),
cond2=c("c","d","c","d"),
x=c(1,5),
y=c(1,5),
sl=c(1,1.2,0.9,1.1),
int=c(0,0.1,0.1,0),
slopeU=c(1.1,1.3,1.2,1.2),
slopeL=c(.9,1,0.7,1))
Run Code Online (Sandbox Code Playgroud)
这里,sl是来自单独拟合程序的平均斜率参数,slopeU并且slopeL表示每个条件中斜率估计的上下置信区域.拦截被限制为相同.以下代码使用一些分面绘制每个条件的最佳拟合线:
p <- ggplot(dat,aes(x=x,y=y,colour=cond1))
p <- p + facet_grid(. ~ cond2)
p <- p + geom_blank()
p <- p + geom_abline(aes(intercept=int,slope=sl,colour=cond1),data=dat)
p
Run Code Online (Sandbox Code Playgroud)
我想补充由定义的行intercept=int, slope=slopeU和intercept=int, slope=slopeL(例如,在对小区和阴影它们之间的区域alpha=.5中的相应COND1颜色).
我认识到,通过一些操作,我可以创建一个数据框,指定这些线的值至少两个x值,然后绘制相应的geom_ribbon或geom_polygon来创建阴影区域,但是我想找到一个更优雅的解决方案.或者是从斜坡手动指定一些坐标并截取唯一的方法?如何最好地创建所需的数据框(需要比原始框架具有更多的行,以考虑条件和x,y对的所有组合).
我正在使用2D浮点numpy数组,我想保存到高精度的灰度.png文件(例如16位).skimage.io如果可能的话,我想使用scikit-image 包.
这是我尝试过的主要内容:
import numpy as np
from skimage import io, exposure, img_as_uint, img_as_float
im = np.array([[1., 2.], [3., 4.]], dtype='float64')
im = exposure.rescale_intensity(im, out_range='float')
im = img_as_uint(im)
im
Run Code Online (Sandbox Code Playgroud)
生产:
array([[ 0, 21845],
[43690, 65535]], dtype=uint16)
Run Code Online (Sandbox Code Playgroud)
首先,我尝试将其保存为图像,然后使用Python Imaging Library重新加载:
# try with pil:
io.use_plugin('pil')
io.imsave('test_16bit.png', im)
im2 = io.imread('test_16bit.png')
im2
Run Code Online (Sandbox Code Playgroud)
生产:
array([[ 0, 85],
[170, 255]], dtype=uint8)
Run Code Online (Sandbox Code Playgroud)
所以在某处(无论是写入还是读取)我都失去了精确度.然后我尝试使用matplotlib插件:
# try with matplotlib:
io.use_plugin('matplotlib')
io.imsave('test_16bit.png', im)
im3 = io.imread('test_16bit.png')
im3
Run Code Online (Sandbox Code Playgroud)
给我一个32位浮点数:
array([[ 0. , 0.33333334],
[ 0.66666669, 1. ]], …Run Code Online (Sandbox Code Playgroud) 以前一定是这个问题,但我恐怕找不到答案.
在R中,我可以写
paste0('s', 1:10)
Run Code Online (Sandbox Code Playgroud)
返回10个字符(字符串)变量的列表:
[1] "s1" "s2" "s3" "s4" "s5" "s6" "s7" "s8" "s9" "s10"
Run Code Online (Sandbox Code Playgroud)
我如何在Python中完成此操作?我能想到的唯一方法是使用for循环,但必须有一个简单的单行.
我尝试过类似的东西
's' + str(np.arange(10))
['s', str(np.arange(10))]
Run Code Online (Sandbox Code Playgroud) 我想使用布尔掩码索引Pandas数据帧,然后根据整数索引在过滤后的数据帧的子集中设置一个值,并将此值反映在数据帧中.也就是说,如果这对数据框架有所了解,我会很高兴.
例:
In [293]:
df = pd.DataFrame({'a': [0, 1, 2, 3, 4, 5, 6, 7],
'b': [5, 5, 2, 2, 5, 5, 2, 2],
'c': [0, 0, 0, 0, 0, 0, 0, 0]})
mask = (df['a'] < 7) & (df['b'] == 2)
df.loc[mask, 'c']
Out[293]:
2 0
3 0
6 0
Name: c, dtype: int64
Run Code Online (Sandbox Code Playgroud)
现在我想设置过滤后的数据帧中返回的前两个元素的值.链接iloc到loc上面的呼叫工作索引:
In [294]:
df.loc[mask, 'c'].iloc[0: 2]
Out[294]:
2 0
3 0
Name: c, dtype: int64
Run Code Online (Sandbox Code Playgroud)
但不要分配:
In [295]:
df.loc[mask, 'c'].iloc[0: 2] …Run Code Online (Sandbox Code Playgroud) Seaborn是一个很棒的包,用于进行一些具有漂亮输出的高级绘图.然而,我正在努力使用Seaborn来覆盖来自外部拟合模型的数据和模型预测.在这个例子中,我在Statsmodels中拟合模型,这些模型对于Seaborn而言过于复杂而无法开箱即用,但我认为问题更为一般(即如果我有模型预测并希望使用Seaborn将它们和数据可视化).
让我们从导入和数据集开始:
import numpy as np
import pandas as pd
import seaborn as sns
import statsmodels.formula.api as smf
import patsy
import itertools
import matplotlib.pyplot as plt
np.random.seed(12345)
# make a data frame with one continuous and two categorical variables:
df = pd.DataFrame({'x1': np.random.normal(size=100),
'x2': np.tile(np.array(['a', 'b']), 50),
'x3': np.repeat(np.array(['c', 'd']), 50)})
# create a design matrix using patsy:
X = patsy.dmatrix('x1 * x2 * x3', df)
# some random beta weights:
betas = np.random.normal(size=X.shape[1])
# create the response variable as …Run Code Online (Sandbox Code Playgroud) 在Seaborn中,您可以使用FacetGrid设置要绘制的数据感知网格.然后,您可以使用map或map_dataframe方法绘制到这些网格.
我无法正确指定与map或一起使用的用户定义的绘图函数map_dataframe.在这个例子中,我使用errorbar我想要将错误值作为2xN数组传递的函数.在我的例子中(取自@ mwaskom 在这里的答案),错误是对称的 - 但想象我有一种情况,他们不是.
In [255]:
from scipy import stats
tips_all = sns.load_dataset("tips")
tips_grouped = tips_all.groupby(["smoker", "size"])
tips = tips_grouped.mean()
tips["error_min"] = tips_grouped.total_bill.apply(stats.sem) * 1.96
tips["error_max"] = tips_grouped.total_bill.apply(stats.sem) * 1.96
tips.reset_index(inplace=True)
tips
Out[255]:
smoker size total_bill tip error_min error_max
0 No 1 8.660000 1.415000 2.763600 2.763600
1 No 2 15.342333 2.489000 0.919042 0.919042
2 No 3 21.009615 3.069231 2.680447 2.680447
3 No 4 27.769231 4.195769 …Run Code Online (Sandbox Code Playgroud) 我有两个numpy形状的阵列(256,256,4).我想将第四个256 x 256平面视为alpha级别,并导出一个覆盖这些数组的图像.
代码示例:
import numpy as np
from skimage import io
fg = np.ndarray((256, 256, 4), dtype=np.uint8)
one_plane = np.random.standard_normal((256, 256)) * 100 + 128
fg[:,:,0:3] = np.tile(one_plane, 3).reshape((256, 256, 3), order='F')
fg[:, :, 3] = np.zeros((256, 256), dtype=np.uint8)
fg[0:128, 0:128, 3] = np.ones((128, 128), dtype=np.uint8) * 255
fg[128:256, 128:256, 3] = np.ones((128, 128), dtype=np.uint8) * 128
bg = np.ndarray((256, 256, 4), dtype=np.uint8)
bg[:,:,0:3] = np.random.standard_normal((256, 256, 3)) * 100 + 128
bg[:, :, 3] = np.ones((256, 256), dtype=np.uint8) …Run Code Online (Sandbox Code Playgroud) 我想计算矩阵的各列之间所有可能的成对差异(无重复)。什么是有效的/ pythonic方式做到这一点?
mat = np.random.normal(size=(10, 3))
mat
array([[ 1.57921282, 0.76743473, -0.46947439],
[ 0.54256004, -0.46341769, -0.46572975],
[ 0.24196227, -1.91328024, -1.72491783],
[-0.56228753, -1.01283112, 0.31424733],
[-0.90802408, -1.4123037 , 1.46564877],
[-0.2257763 , 0.0675282 , -1.42474819],
[-0.54438272, 0.11092259, -1.15099358],
[ 0.37569802, -0.60063869, -0.29169375],
[-0.60170661, 1.85227818, -0.01349722],
[-1.05771093, 0.82254491, -1.22084365]])
Run Code Online (Sandbox Code Playgroud)
在此矩阵中,存在3个成对的差异(N选择k个唯一的组合,顺序无关紧要)。
pair_a = mat[:, 0] - mat[:, 1]
pair_b = mat[:, 0] - mat[:, 2]
pair_c = mat[:, 1] - mat[:, 2]
Run Code Online (Sandbox Code Playgroud)
是一种(丑陋的)方式。您可以轻松想象将嵌套for循环用于较大的矩阵,但是我希望有更好的方法。
我希望结果是具有scipy.misc.comb(mat.shape[1], 2)列和mat.shape[0]行的另一个矩阵。
python ×7
numpy ×3
r ×2
scikit-image ×2
scipy ×2
seaborn ×2
ggplot2 ×1
image ×1
matplotlib ×1
pandas ×1
statsmodels ×1
string ×1