3 回答

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
我最終使用 matplotlib 庫(kù)從底層構(gòu)建它:
plt.style.use('seaborn')
IAP = df_original_small['Information and awareness purposes'].value_counts().to_frame().T
QE = df_original_small['Quarantine Enforcement'].value_counts().to_frame().T
CTCR = df_original_small['Contact Tracing and Cross-Referencing'].value_counts().to_frame().T
VPID = df_original_small['Voluntary provision of infection data'].value_counts().to_frame().T
QMA = df_original_small['Quarantine Monitoring App'].value_counts().to_frame().T
QRCode = df_original_small['QR code provided registration tracking'].value_counts().to_frame().T
total = pd.concat([IAP, QE, CTCR, VPID, QMA, QRCode])
fig, ax = plt.subplots(nrows=3, ncols=2)
labels = 'acceptable', 'unacceptable'
colors = ['#008fd5', '#fc4f30']
explode = (0, 0.1)
explode2 = (0.2, 0)
plt.title('Pie chart per CTQ-tool')
plt.tight_layout()
ax[0,0].pie(total.iloc[[0]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode, shadow=True)
ax[0,0].set_title('Information and awareness purposes', fontweight='bold')
ax[0,1].pie(total.iloc[[1]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode, shadow=True)
ax[0,1].set_title('Quarantine Enforcement', fontweight='bold')
ax[1,0].pie(total.iloc[[2]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode2, shadow=True)
ax[1,0].set_title('Contact Tracing and Cross-Referencing', fontweight='bold')
ax[1,1].pie(total.iloc[[3]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode, shadow=True)
ax[1,1].set_title('Voluntary provision of infection data', fontweight='bold')
ax[2,0].pie(total.iloc[[4]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode2, shadow=True)
ax[2,0].set_title('Quarantine Monitoring App', fontweight='bold')
ax[2,1].pie(total.iloc[[5]], startangle=90, colors=colors, wedgeprops={'edgecolor': 'black'}, autopct='%1.f%%', explode=explode, shadow=True)
ax[2,1].set_title('QR code provided registration tracking', fontweight='bold')
fig.suptitle('Public Opinion on CTQ-measures', fontsize=20, y=1.07, fontweight='bold', x=0.37)
fig.set_figheight(10)
fig.set_figwidth(7)
fig.legend(loc='best', labels=labels, fontsize='medium')
fig.tight_layout()
fig.savefig('Opinions_ctq')
plt.show()

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個(gè)贊
如果你想要快速的東西,你也可以試試這個(gè):
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = pd.DataFrame({'CTQ-tool':np.random.choice(['a','b','c','d'],50),
'opinion':np.random.choice(['acceptable','unacceptable'],50)})
fig, ax = plt.subplots(2,2)
ax = ax.flatten()
tab = pd.crosstab(df['CTQ-tool'],df['opinion'])
for i,cat in enumerate(tab.index):
tab.loc[cat].plot.pie(ax=ax[i],startangle=90)
ax[i].set_ylabel('')
ax[i].set_title(cat, fontweight='bold')

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
問題是關(guān)于創(chuàng)建餅圖,python所以我認(rèn)為你可以使用另一個(gè)可視化庫(kù),比如Plotly,除了作為一個(gè)可視化庫(kù)之外,Plotly它還是一個(gè)交互式可視化庫(kù),所以你所有的圖表都是交互式的!
快速瀏覽一下餅圖文檔。
現(xiàn)在,對(duì)于你的問題,我創(chuàng)建了一個(gè)小數(shù)據(jù)集并創(chuàng)建了兩個(gè)餅圖來說明代碼的樣子。
首先,導(dǎo)入所需的庫(kù):
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from kaleido.scopes.plotly import PlotlyScope # this will be used to export the chart as static image
玩具數(shù)據(jù)集:
df = pd.DataFrame(
{
"CTQ-tool": [
"Information and awareness purposes",
"Information and awareness purposes",
"Information and awareness purposes",
"Information and awareness purposes",
"Information and awareness purposes",
"Information and awareness purposes",
"Quarantine Enforcement",
"Quarantine Enforcement",
"Quarantine Enforcement",
"Quarantine Enforcement",
"Quarantine Enforcement",
"Quarantine Enforcement",
],
"opinion": [
"unacceptable",
"unacceptable",
"unacceptable",
"unacceptable",
"acceptable",
"unacceptable",
"acceptable",
"unacceptable",
"acceptable",
"unacceptable",
"unacceptable",
"unacceptable",
],
}
)
保存獨(dú)特的不同工具:
tools = df["CTQ-tool"].unique()
創(chuàng)建聚合數(shù)據(jù):
以下代碼將按工具類型和意見類型分組,然后counts為每個(gè)工具創(chuàng)建一個(gè)新列,用于存儲(chǔ)每種意見類型的計(jì)數(shù)。
df_agg = df.groupby(by=["CTQ-tool", "opinion"]).size().reset_index(name="counts")
新的數(shù)據(jù)框df_agg將是:
| | CTQ-tool | opinion | counts |
| ---: | :--------------------------------- | :----------- | -----: |
| 0 | Information and awareness purposes | acceptable | 1 |
| 1 | Information and awareness purposes | unacceptable | 5 |
| 2 | Quarantine Enforcement | acceptable | 2 |
| 3 | Quarantine Enforcement | unacceptable | 4 |
可視化數(shù)據(jù)(有趣的部分):由于這個(gè)玩具數(shù)據(jù)只有兩個(gè)不同的工具,我創(chuàng)建了一個(gè)sub-plot只有一行和兩列的工具,但您可以將其擴(kuò)展為任意多的行/列。
fig = make_subplots(rows=1, cols=2, specs=[[{"type": "domain"}, {"type": "domain"}]])
然后分別添加每個(gè)圖表(您可以使用 for 循環(huán)來完成):
fig = make_subplots(rows=1, cols=2, specs=[[{"type": "domain"}, {"type": "domain"}]])
# Information and awareness purposes tool
fig.add_trace(
go.Pie(
values=df_agg[df_agg["CTQ-tool"] == tools[0]]["counts"],
labels=df_agg[df_agg["CTQ-tool"] == tools[0]]["opinion"],
pull=[0.2, 0.0],
title=tools[0],
),
1,
1,
)
# Quarantine Enforcement tool
fig.add_trace(
go.Pie(
values=df_agg[df_agg["CTQ-tool"] == tools[1]]["counts"],
labels=df_agg[df_agg["CTQ-tool"] == tools[1]]["opinion"],
pull=[0.2, 0.0],
title=tools[1],
),
1,
2,
)
更新圖表布局:
fig.update_layout(title_text="Public Opinion on CTQ-measures")
fig.show()
最后,導(dǎo)出為靜態(tài)圖像:
現(xiàn)在您已經(jīng)準(zhǔn)備好數(shù)據(jù)并對(duì)其進(jìn)行可視化,是時(shí)候?qū)⑵浔4鏋閳D像了。Plotly 的創(chuàng)作者為此構(gòu)建了一個(gè)工具:Kaleido。
您可以簡(jiǎn)單地使用它如下:
scope = PlotlyScope()
fig_name = "Public-Opinion-on-CTQ-measures"
with open(f"{fig_name}.png", "wb") as f:
f.write(scope.transform(fig, "png"))
這個(gè)數(shù)字是:
添加回答
舉報(bào)