据我所知,您可以使用两种方法在library(dplyr)
library(tidyr)
separate(df, fact, into = c("position1", "position2")) %>% #splits the column into two
gather() %>% #converts to long format
group_by(key, value) %>% #grouped by both the columns
count() %>% #get the count
spread(key, n, fill=0) #spread to wide format
# A tibble: 3 × 3
# value position1 position2
#* <chr> <dbl> <dbl>
#1 a 1 0
#2 b 0 2
#3 c 1 0
中绘制渐变,即CGContext
和drawLinearGradient
。我正在寻找的是一种定义椭圆渐变的方法,我可以在其中定义drawRadialGradient
和x
半径。
另一个环境(y
)中此功能的示例。
SVG
<RadialGradient id="gradient" cx="50" cy="50" rx="20" ry="40" fx="150" fy="75">
的现有声明如下:
drawRadialGradient
开始和结束半径都是标量值,所以你所能做的只是圆圈。如何在func drawRadialGradient(_ gradient: CGGradient,
startCenter: CGPoint,
startRadius: CGFloat,
endCenter: CGPoint,
endRadius: CGFloat,
options: CGGradientDrawingOptions)
?
答案 0 :(得分:1)
您应该能够缩放上下文并使用CGContextDrawRadialGradient()。如果按比例缩小,则不应有任何伪像。以下工作正常吗?
CGContextRef context;
CGGradientRef gradient;
CGGradientDrawingOptions options;
CGPoint center;
CGFloat radiusX;
CGFloat radiusY;
CGFloat radius = MAX(radiusX, radiusY);
CGContextSaveGState(context);
// scale down by the smaller dimension, and translate so the center stays in place
if (radiusX < radiusY) {
CGContextTranslateCTM(context, center.x - (center.x * (radiusX / radiusY)), 0);
CGContextScaleCTM(context, radiusX / radiusY, 1.0);
}
else {
CGContextTranslateCTM(context, 0, center.y - (center.y * (radiusY / radiusX)));
CGContextScaleCTM(context, 1.0, radiusY / radiusX);
}
CGContextDrawRadialGradient(context, gradient, center, 0, center, radius, options);
CGContextRestoreGState(context);
顺便说一句,如果将type
的{{1}}属性设置为CAGradientLayer
的未记录的私有值,则我认为这是大致的行为。它使用startPoint作为中心,并使用startPoint和endPoint的差来确定radiusX和radiusY值(即endPoint定义渐变的边界框的一个角,而startPoint是中心)。当您使起点和终点几乎相同时,它的行为确实很奇怪,所以那里可能发生的事情比我想像的还要多(这也许就是为什么苹果公司从不理会将其公开)的原因。
答案 1 :(得分:0)
我唯一能想到的是在绘制渐变之前将不等x和y比例因子的比例变换应用于上下文。这会使它变得圆滑,并且应该使它变成椭圆形。
答案 2 :(得分:0)
没有“皇家之路”。此工具不是内置的,因此您必须自己绘制每个像素。 (可能有第三方库会为您做这件事。)