Вы можете создать сложенную диаграмму области, используя глиф патча. Сначала я использовал df.cumsum для суммирования значений в кадре данных по строкам. После этого я добавляю две строки в фрейм данных с максимальной и минимальной датой и значением Y. Я строю патчи в обратном порядке списка столбцов (исключая столбец даты), чтобы сначала отображался человек с наивысшими значениями лица с более низкими значениями наносятся на график после.
Другая реализация диаграммы с областями с накоплением может быть найдена здесь .
import pandas as pd
from bokeh.plotting import figure, show
from bokeh.palettes import inferno
from bokeh.models.formatters import DatetimeTickFormatter
df = pd.read_csv('stackData.csv')
df_stack = df[list(df)[1:]].cumsum(axis=1)
df_stack['date'] = df['date'].astype('datetime64[ns]')
bot = {list(df)[0]: max(df_stack['date'])}
for column in list(df)[1:]:
bot[column] = 0
df_stack = df_stack.append(bot, ignore_index=True)
bot = {list(df)[0]: min(df_stack['date'])}
for column in list(df)[1:]:
bot[column] = 0
df_stack = df_stack.append(bot, ignore_index=True)
p = figure(x_axis_type='datetime')
p.xaxis.formatter=DatetimeTickFormatter(days=["%d/%m/%Y"])
p.xaxis.major_label_orientation = 45
for person, color in zip(list(df_stack)[2::-1], inferno(len(list(df_stack)))):
p.patch(x=df_stack['date'], y=df_stack[person], color=color, legend=person)
p.legend.click_policy="hide"
show(p)
В этом случае для установки переменной не требуется никаких условий .
Это однострочное выражение XPath :
boolean(joined-subclass)
имеет значение true ()
только тогда, когда существует дочерний узел текущего узла с именем join-subclass
, а в противном случае - false ()
.
] Полная таблица стилей выглядит так: :
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="class">
<xsl:variable name="subexists"
select="boolean(joined-subclass)"
/>
subexists: <xsl:text/>
<xsl:value-of select="$subexists" />
</xsl:template>
</xsl:stylesheet>
Обратите внимание , что использование функции XPath boolean ()
в этом выражении предназначено для преобразования узла (или его отсутствия) в один из логические значения true ()
или false ()
.
Ваша основная проблема - думать, что переменная, которую вы объявили вне шаблона, - это та же переменная, которая «установлена» внутри оператора выбора. Это не то, как работает XSLT, переменная не может быть переназначена. Это больше похоже на то, что вы хотите:
<xsl:template match="class">
<xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
subexists: <xsl:value-of select="$subexists" />
</xsl:template>
И если вам нужно, чтобы переменная имела "глобальную" область видимости, объявите ее вне шаблона:
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="/path/to/node/joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:template match="class">
subexists: <xsl:value-of select="$subexists" />
</xsl:template>
В XSLT то же самое
может объявляется только один раз и может быть присвоено значение только при его объявлении. Если одновременно объявляется более одной переменной, они фактически являются разными переменными и имеют разную область действия.
Следовательно, способ достижения требуемой условной установки переменной и получения ее значения следующее:
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes"/>
<xsl:template match="class">
<xsl:variable name="subexists">
<xsl:choose>
<xsl:when test="joined-subclass">true</xsl:when>
<xsl:otherwise>false</xsl:otherwise>
</xsl:choose>
</xsl:variable>
subexists: <xsl:text/>
<xsl:value-of select="$subexists" />
</xsl:template>
</xsl:stylesheet>
Когда вышеуказанное преобразование применяется к следующему документу XML :
<class>
<joined-subclass/>
</class>
, получается требуемый результат :
subexists: true