亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python:需要在箱線圖中重疊實際數據

Python:需要在箱線圖中重疊實際數據

開心每一天1111 2023-06-06 15:39:15
我正在使用此代碼在箱線圖中繪制我的數據:import matplotlib.pyplot as pltimport numpy as npfrom matplotlib.patches import Polygonrandom_dists = ['Overlap', 'Non overlap', ]Overlap= [6,6,5,1,3,4,4,3]non_overlap= [1,2,6,6,1,3,3,3,3,3,5,2,2]data = [? ? Overlap,? ? non_overlap]fig, ax1 = plt.subplots(figsize=(6, 6))fig.canvas.set_window_title('A Boxplot Example')fig.subplots_adjust(left=0.075, right=0.95, top=0.9, bottom=0.25)# bp = ax1.boxplot(data, notch=0, sym='+', vert=1, whis=1.5)bp = ax1.boxplot(data)plt.setp(bp['boxes'], color='black')plt.setp(bp['whiskers'], color='black')plt.setp(bp['fliers'], color='red', marker='+')? ??? ??# Add a horizontal grid to the plot, but make it very light in color# so we can use it for reading data values but not be distractingax1.yaxis.grid(True, linestyle='-', which='major', color='lightgrey',? ? ? ? ? ? ? ?alpha=0.5)# Hide these grid behind plot objectsax1.set_axisbelow(True)ax1.set_title('overlap and non_overlap against mRS')# ax1.set_xlabel('Distribution')# ax1.set_ylabel('Value')# Now fill the boxes with desired colorsbox_colors = ['darkkhaki', 'royalblue']num_boxes = len(data)medians = np.empty(num_boxes)for i in range(num_boxes):? ? box = bp['boxes'][i]? ? boxX = []? ? boxY = []? ? for j in range(5):? ? ? ? boxX.append(box.get_xdata()[j])? ? ? ? boxY.append(box.get_ydata()[j])? ? box_coords = np.column_stack([boxX, boxY])? ? # Alternate between Dark Khaki and Royal Blue? ? ax1.add_patch(Polygon(box_coords, facecolor=box_colors[i % 2]))? ? # Now draw the median lines back over what we just filled in我需要的是將數據作為散點圖重疊到其中,我真的很努力地使用鏈接上的代碼,并嘗試在 overstack 上搜索以找到解決方案,但我在編碼方面不是那么好,我也嘗試使用 seaborn 庫,但我總是得到一個錯誤:'list' object has沒有屬性'get'并且無法修復它所以請任何人幫助()
查看完整描述

1 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

當前版本plt.boxplot()允許繪制這些元素中的大部分標準。showmeans如果設置為,將繪制均值True。它的屬性可以通過字典來控制meanprops。設置時patch_artist=True,將繪制一個填充框,而不僅僅是輪廓,boxprops控制它們的外觀。


要在頂部繪制散點圖,只需調用ax1.scatter. x 位置可以通過 隨機抖動i + np.random.uniform(-0.4, 0.4)。要強制它們位于箱線圖之上,可以更改它們的 z 順序。


由于傳單也是散點數據的一部分,因此將它們排除在外可能是有意義的 ( showfliers=False)。


要創建圖例,您可以收集所有所需元素的句柄并將它們傳遞給ax1.legend(). 請注意,您的箱線圖已經在 x 軸上獲得了標簽,因此將它們也放在圖例中可能有點多余。


import matplotlib.pyplot as plt

import numpy as np


random_dist_names = ['Overlap', 'Non overlap']

overlap = [6, 6, 5, 1, 3, 4, 4, 3]

non_overlap = [1, 2, 6, 6, 1, 3, 3, 3, 3, 3, 5, 2, 2]

data = [overlap, non_overlap]


fig, ax1 = plt.subplots(figsize=(6, 6))

fig.canvas.set_window_title('A Boxplot Example')

fig.subplots_adjust(left=0.075, right=0.95, top=0.9, bottom=0.25)


box_colors = ['darkkhaki', 'royalblue']

scatter_colors = ['purple', 'crimson']

legend_handles = []

for i, (values, box_color, scatter_color) in enumerate(zip(data, box_colors, scatter_colors), start=1):

    bp = ax1.boxplot(values, positions=[i], showmeans=True, patch_artist=True, showfliers=False,

                     boxprops={'edgecolor': 'black', 'facecolor': box_color},

                     whiskerprops={'color': 'black'},  # flierprops={'color': 'red', 'marker': '+'},

                     medianprops={'color': 'lime', 'linewidth': 2, 'linestyle': ':'},

                     meanprops={'markerfacecolor': 'w', 'marker': '*', 'markeredgecolor': 'k', 'markersize': 10})

    if i == 1:

        legend_handles.append(bp['means'][0])

    legend_handles.append(bp['boxes'][0])

    ax1.scatter(i + np.random.uniform(-0.4, 0.4, len(values)), values, color=scatter_color, alpha=0.5, zorder=3)


ax1.yaxis.grid(True, linestyle='-', which='major', color='lightgrey', alpha=0.5)

ax1.set_axisbelow(True)

ax1.set_title('overlap and non_overlap against mRS')


ax1.set_xlim(0.5, len(data) + 0.5)

ax1.set_ylim(ymin=0)

ax1.set_xticklabels(random_dist_names, rotation=0, fontsize=8)

ax1.legend(legend_handles, ['Mean'] + random_dist_names, bbox_to_anchor=[1, -0.1], loc='upper right')


plt.show()

http://img1.sycdn.imooc.com//647ee2df0001058c07060537.jpg

請注意,您的數據點很少,而且它們都有整數值,這使得紅點出現在水平線上。


PS:要創建與 Seaborn 類似的東西,數據的組織方式必須更類似于 pandas 數據框。這樣的數據框將有一列包含所有值,一列包含類別。


可以更自動地創建圖例。為了將均值也納入圖例,必須通過 將標簽分配給均值meanprops={..., 'label': 'Mean'}。不幸的是,這會為每個框創建一個圖例條目。這些可以通過首先獲取所有圖例條目并ax.get_legend_handles_labels()獲取句柄和標簽的子數組來跳過。


import matplotlib.pyplot as plt

import numpy as np

import seaborn as sns


random_dist_names = ['Overlap', 'Non overlap']

overlap = [6, 6, 5, 1, 3, 4, 4, 3]

non_overlap = [1, 2, 6, 6, 1, 3, 3, 3, 3, 3, 5, 2, 2]

data_names = np.repeat(random_dist_names, [len(overlap), len(non_overlap)])

data_values = np.concatenate([overlap, non_overlap])


ax = sns.boxplot(x=data_names, y=data_values, hue=data_names, palette=['darkkhaki', 'royalblue'],

                 dodge=False, showfliers=False, showmeans=True,

                 meanprops={'markerfacecolor': 'w', 'marker': '*', 'markeredgecolor': 'k', 'markersize': 10, 'label': 'Mean'})

sns.stripplot(x=data_names, y=data_values, color='red', alpha=0.4)

handles, labels = ax.get_legend_handles_labels()

skip_pos = len(random_dist_names) - 1

ax.legend(handles[skip_pos:], labels[skip_pos:], bbox_to_anchor=(1.02, -0.05), loc='upper right')

plt.tight_layout()

plt.show()


查看完整回答
反對 回復 2023-06-06
  • 1 回答
  • 0 關注
  • 242 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號