SVG rect в качестве фона для текста [дубликат]

Вам нужно использовать flatMap, а не map, поскольку вы хотите сделать несколько выходных строк из каждой строки ввода.

from pyspark.sql import Row
def dualExplode(r):
    rowDict = r.asDict()
    bList = rowDict.pop('b')
    cList = rowDict.pop('c')
    for b,c in zip(bList, cList):
        newDict = dict(rowDict)
        newDict['b'] = b
        newDict['c'] = c
        yield Row(**newDict)

df_split = sqlContext.createDataFrame(df.rdd.flatMap(dualExplode))
68
задан Nick Ginanto 19 March 2013 в 15:30
поделиться

7 ответов

Нет, это невозможно, элементы SVG не имеют атрибутов представления background-... .

Чтобы смоделировать этот эффект, вы можете нарисовать прямоугольник за текстовым атрибутом с помощью fill="green" или чего-то подобного (фильтры). С помощью JavaScript вы можете сделать следующее:

var ctx = document.getElementById("the-svg"),
textElm = ctx.getElementById("the-text"),
SVGRect = textElm.getBBox();

var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
    rect.setAttribute("x", SVGRect.x);
    rect.setAttribute("y", SVGRect.y);
    rect.setAttribute("width", SVGRect.width);
    rect.setAttribute("height", SVGRect.height);
    rect.setAttribute("fill", "yellow");
    ctx.insertBefore(rect, textElm);
66
ответ дан Roger 28 August 2018 в 02:11
поделиться

Решение, которое я использовал, это:

<svg>
  <line x1="100" y1="100" x2="500", y2="100" style="stroke:black; stroke-width: 2"/>    
  <text x="150" y="105" style="stroke:white; stroke-width:0.6em">Hello World!</text>
  <text x="150" y="105" style="fill:black">Hello World!</text>  
</svg>

Добавляется дублирующийся текстовый элемент с атрибутами штриха и ширины штриха. Инсульт должен соответствовать цвету фона, а ширина штриха должна быть достаточно большой, чтобы создать «splodge», на котором можно записать фактический текст.

Немного взлома и есть потенциальные проблемы, но работает для меня!

7
ответ дан bartelski 28 August 2018 в 02:11
поделиться

это мой любимый хак (не уверен, что он должен работать). Он ссылается на элемент, который еще не отображается, и он работает довольно хорошо

<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 620 40" preserveAspectRatio="xMidYMid meet">
    <defs>
        <filter x="-0.02" y="0" width="1.04" height="1.1" id="removebackground">
            <feFlood flood-color="#00ffff"/>
        </filter>
    </defs>

    <!--Draw the text--> 
    <use xlink:href="#mygroup" filter="url(#removebackground)" />
    <g id="mygroup">
        <text id="text1" x="9" y="20" style="text-anchor:start;font-size:14px;">custom text with background</text>  
        <line x1="200" y1="18" x2="200" y2="36" stroke="#000" stroke-width="5"/> 
        <line x1="120" y1="27" x2="203" y2="27" stroke="#000" stroke-width="5"/> 
    </g>
</svg>

1
ответ дан Calimero100582 28 August 2018 в 02:11
поделиться

Вместо использования тега <text> можно использовать тег <foreignObject> , который позволяет использовать контент XHTML с CSS.

0
ответ дан Chris G 28 August 2018 в 02:11
поделиться

Нет, вы не можете добавить цвет фона к элементам SVG. Вы можете сделать это программно с помощью d3 .

var text = d3.select("text");
var bbox = text.node().getBBox();
var padding = 2;
var rect = self.svg.insert("rect", "text")
    .attr("x", bbox.x - padding)
    .attr("y", bbox.y - padding)
    .attr("width", bbox.width + (padding*2))
    .attr("height", bbox.height + (padding*2))
    .style("fill", "red");
12
ответ дан nnattawat 28 August 2018 в 02:11
поделиться

Вы можете использовать фильтр для генерации фона.

<svg width="100%" height="100%">
  <defs>
    <filter x="0" y="0" width="1" height="1" id="solid">
      <feFlood flood-color="yellow"/>
      <feComposite in="SourceGraphic"/>
    </filter>
  </defs>
<text filter="url(#solid)" x="20" y="50" font-size="50">solid background</text>
</svg>

52
ответ дан Robert Longson 28 August 2018 в 02:11
поделиться

Ответа на этот вопрос Robert Longson (@RobertLongson) с изменениями:

<svg width="100%" height="100%">
  <defs>
    <filter x="0" y="0" width="1" height="1" id="solid">
      <feFlood flood-color="yellow"/>
      <feComposite in="SourceGraphic" operator="xor"/>
    </filter>
  </defs>
  <text filter="url(#solid)" x="20" y="50" font-size="50"> solid background </text>
  <text x="20" y="50" font-size="50">solid background</text>
</svg>

, и мы не имеем никакого размытия и никакого тяжелого «getBBox» :). Заполнение обеспечивается пробелами в текстовом элементе с фильтром. Это сработало для меня

3
ответ дан Roman Belov 28 August 2018 в 02:11
поделиться