4 回答

TA貢獻(xiàn)1906條經(jīng)驗(yàn) 獲得超3個(gè)贊
ggplot2
如果您在其中任何一個(gè)中使用,這將不會(huì)顯示圖例R
:顏色的圖例將僅在您color=
在美學(xué)中指定時(shí)表示 a geom
。兩者python
或ggplot
for中的“修復(fù)”是相同的r
。您需要組織數(shù)據(jù),以便遵循整潔的數(shù)據(jù)原則。在這種情況下,df$b
每個(gè)df$c
列都包含兩條信息:(1) “y”的值和(2) “y”的類型。您應(yīng)該相應(yīng)地重新組織數(shù)據(jù),以便您的列名變?yōu)椋?code>x、type_of_y
和value_of_y
。
我將通過(guò)填寫(xiě)您提供的數(shù)據(jù)集進(jìn)行解釋,然后說(shuō)明我們?nèi)绾螌⑵涓臑檎麧嵉母袷剑缓竽绾危ㄕ_)應(yīng)用代碼來(lái)表示我相信您想要的情節(jié)。
基礎(chǔ)知識(shí)
這是一個(gè)數(shù)據(jù)集和一個(gè)像你的情節(jié)一樣的情節(jié)(同樣,它在r
......所以我希望你能翻譯成python
):
df <- data.frame(
x=c(1:5), b=c(10, 12, 14, 9, 8), c=c(9, 11, 11, 12, 14))
ggplot(df, aes(x=x)) +
geom_line(aes(y=b), color='red') +
geom_line(aes(y=c), color='blue')
沒(méi)有傳說(shuō),但顏色就在那里,我們繪制您所期望的。這里的問(wèn)題是當(dāng)您在調(diào)用ggplot中指定顏色時(shí)會(huì)繪制一個(gè)圖例。 為了清楚地看到這一點(diǎn),讓我們做同樣的情節(jié),但移動(dòng)內(nèi)部:aes()color=...aes()
ggplot(df, aes(x=x)) +
geom_line(aes(y=b, color='red')) +
geom_line(aes(y=c, color='blue'))
好的,那……等等。什么?它現(xiàn)在有一個(gè)圖例(因?yàn)槲覀儼阉旁赾olor 里面 aes()),但是顏色實(shí)際上是按順序顛倒的,而且......你會(huì)注意到顏色不是紅色和藍(lán)色,而是默認(rèn)的“紅色”和“藍(lán)綠色”顏色ggplot2。實(shí)際上,發(fā)生的事情是我們只指定在第一次geom_line調(diào)用中,我們繪制了正確的數(shù)據(jù)集,但我們只是將數(shù)據(jù)“命名”為“紅色”。同樣,我們將另一個(gè)數(shù)據(jù)集“命名”為“藍(lán)色”。 ggplot根據(jù)默認(rèn)調(diào)色板決定使用什么顏色。
無(wú)需整理數(shù)據(jù)即可獲得傳奇
如果您不想弄亂您的數(shù)據(jù),實(shí)際上有一種方法可以做到這一點(diǎn),并且可能會(huì)獲得您可能會(huì)滿意的輸出。我們只需要在名稱中注明color=您要調(diào)用該系列即可。
ggplot(df, aes(x=x)) +
geom_line(aes(y=b, color='b')) +
geom_line(aes(y=c, color='c'))
添加另一個(gè)以在外部和內(nèi)部color='blue'獲得“藍(lán)色”顏色怎么樣?嗯……這行不通。例如,如果您這樣做,結(jié)果與顯示的原始圖相同(沒(méi)有圖例,但顏色值正確),因?yàn)樵诿看握{(diào)用中都會(huì)有效地覆蓋:aes()aes()geom_line
# this doesn't work to keep legend and desired color, the second
# color outside aes() overwrites the one inside aes()
ggplot(df, aes(x=x)) +
geom_line(aes(y=b, color='b'), color='red') +
geom_line(aes(y=c, color='c'), color='blue')
整潔的數(shù)據(jù)方式(“正確”方式)
雖然上述方法有效,但它違反了整潔數(shù)據(jù)的一般原則以及如何組織數(shù)據(jù)以便易于分析......以任何你想要的方式。相信我:這絕對(duì)是使用任何數(shù)據(jù)集進(jìn)行多功能分析的最佳實(shí)踐,并且?guī)缀蹩偸侵档酶冻雠σ赃@種方式組織數(shù)據(jù)。
ggplot 希望您將aes()參數(shù)指定為數(shù)據(jù)集中的列。這意味著我們應(yīng)該使每一列在您的數(shù)據(jù)集中具有特定的用途,如下所示:
x:這
x
在原始數(shù)據(jù)集中是相同的。它僅表示 x 軸值type_of_y:此列包含值“b”或“c”,指示值應(yīng)來(lái)自哪個(gè)數(shù)據(jù)系列。
value_of_y:此列包含您將在 y 上繪制的值。
使用dplyr
,我們可以非常簡(jiǎn)單地以這種方式重組數(shù)據(jù):
df <- df %>% gather('type_of_y', 'value_of_y', -x)
給你:
x type_of_y value_of_y
1 1 b 10
2 2 b 12
3 3 b 14
4 4 b 9
5 5 b 8
6 1 c 9
7 2 c 11
8 3 c 11
9 4 c 12
10 5 c 14
然后你相應(yīng)地繪制,只使用一個(gè)geom_line調(diào)用并將color美學(xué)應(yīng)用于type_of_y. 像這樣的東西:
ggplot(df, aes(x=x, y=value_of_y)) +
geom_line(aes(color=type_of_y))
這樣,您只需指定一個(gè)geom_line
調(diào)用。在這里可能看起來(lái)并沒(méi)有太大的不同,但是如果您的原始數(shù)據(jù)集中有多個(gè)列怎么辦?例如,有“x”,然后是“a”、“b”、“c”...“z”的 y 值!您必須在單獨(dú)的調(diào)用中指定所有這些行geom_line
!在上述情況下,無(wú)論您有多少個(gè)不同的 y 值列……您只有相同的兩行代碼,并且只有一次調(diào)用geom_line
. 說(shuō)得通?有關(guān)更多信息,我會(huì)建議上面的鏈接。此外,這篇文章非常適合閱讀。
然后,您可以通過(guò)添加scale_color_manual
和指定顏色來(lái)指定特定顏色(還有其他一些方法) - 但如果您需要幫助,我會(huì)在單獨(dú)的問(wèn)題中提問(wèn)。另外...不確定代碼與python
. labs(color="your new legend title")
同樣,您可以通過(guò)... 在其他主題更改中更改圖例的標(biāo)題。
我知道它與 中的代碼并不完全相同python
,但這應(yīng)該足以讓您了解我們?nèi)绾卧谄渲羞M(jìn)行類似的操作。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
def plot_log_detected():
df = DataFrame({'x': [1, 2, 3, 4, 5],
'b': >>>SOME VALUES DOESNT MATTER<<<,
'c': >>>SOME VALUES DOESNT MATTER<<<
})
plot = (
ggplot(aes(x='x', y='b'), data=df)
+ geom_point(size=1)
+ geom_line(aes(y='b', color='"black"')) # Put color in double quotes
+ geom_line(aes(y='c', color='"blue"')) # Put color in double quotes
+ ggtitle("TITLE")
+ labs(y="Y AXIS", x="X AXIS")
# Add color scale identity
+ scale_color_identity(
guide='legend',
breaks=['black', 'blue'],
labels=['Label for black', 'Label for blue']))
return plot

TA貢獻(xiàn)1862條經(jīng)驗(yàn) 獲得超7個(gè)贊
我有另一個(gè)解決方案,我使用了 melt 將寬數(shù)據(jù)格式轉(zhuǎn)換為長(zhǎng)數(shù)據(jù)格式。為了生成圖例,我們需要為美學(xué)映射提供一個(gè)分組列,因此使用 melt 我們可以創(chuàng)建一個(gè)列標(biāo)簽類別并將其傳遞給 plotnine 顏色參數(shù)。
def plot_log_detected():
df = DataFrame({'x': [1, 2, 3, 4, 5],
'b': [22,33,21,66,55],
'c': [44,11,22,77,55]
})
long_data = pd.melt(df, id_vars=["x"], value_vars=["b", "c"])
long_data = long_data.rename(columns = {'variable':'category'})
return ggplot(aes(x='x', y='value', color = "category"), data=long_data) +\
geom_point(size=1) +\
geom_line() + \
ggtitle("TITLE") + \
labs(y="Y AXIS", x="X AXIS")
plot_log_detected()

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊
您可以融合您的數(shù)據(jù)框以將列“b”和“c”合并為一列,并為著色和圖例創(chuàng)建一個(gè)美學(xué)列“顏色”。這是代碼和輸出。請(qǐng)注意,我將原始數(shù)據(jù)框用于點(diǎn)圖(因?yàn)槟辉谄渲欣L制“b”列)并將融化的數(shù)據(jù)框用于線圖:
def plot_log_detected():
df = DataFrame({'x': [1, 2, 3, 4, 5],
'b': [1, 2, 3, 4, 5],
'c': [1, 3, 2, 5, 4]
})
df_melt = df.melt(id_vars=['x'], value_vars=['b','c'], var_name='color', value_name='b_and_c')
return ggplot(aes(x='x', y='b'), data=df) + geom_point(size=1) +\
geom_line(aes(y='b_and_c', color='color'), data=df_melt) + \
ggtitle("TITLE") + \
labs(y="Y AXIS", x="X AXIS")
您的原始示例數(shù)據(jù)框如下所示:
x b c
0 1 1 1
1 2 2 3
2 3 3 2
3 4 4 5
4 5 5 4
你融化的數(shù)據(jù)框是:
x color b_and_c
0 1 b 1
1 2 b 2
2 3 b 3
3 4 b 4
4 5 b 5
5 1 c 1
6 2 c 3
7 3 c 2
8 4 c 5
9 5 c 4
最后這是輸出圖像:
添加回答
舉報(bào)