python 在直方图中标记新数据点
python labelling new data points in a histogram
我目前正在使用这段代码绘制直方图。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import FormatStrFormatter
data = np.random.randn(82)
fig, ax = plt.subplots()
counts, bins, patches = ax.hist(data, facecolor='yellow', edgecolor='gray')
# Set the ticks to be at the edges of the bins.
ax.set_xticks(bins)
# Set the xaxis's tick labels to be formatted with 1 decimal place...
ax.xaxis.set_major_formatter(FormatStrFormatter('%0.1f'))
# Change the colors of bars at the edges...
twentyfifth, seventyfifth = np.percentile(data, [25, 75])
for patch, rightside, leftside in zip(patches, bins[1:], bins[:-1]):
if rightside < twentyfifth:
patch.set_facecolor('green')
elif leftside > seventyfifth:
patch.set_facecolor('red')
# Label the raw counts and the percentages below the x-axis...
bin_centers = 0.5 * np.diff(bins) + bins[:-1]
for count, x in zip(counts, bin_centers):
# Label the raw counts
ax.annotate(str(count), xy=(x, 0), xycoords=('data', 'axes fraction'),
xytext=(0, -18), textcoords='offset points', va='top', ha='center')
# Label the percentages
percent = '%0.0f%%' % (100 * float(count) / counts.sum())
ax.annotate(percent, xy=(x, 0), xycoords=('data', 'axes fraction'),
xytext=(0, -32), textcoords='offset points', va='top', ha='center')
# Give ourselves some more room at the bottom of the plot
plt.subplots_adjust(bottom=0.15)
plt.show()
我想在直方图上添加给定直方图 x 轴值的 x 标记(标有“橙色”、“苹果”、“菠萝”),如图所示:
我应该怎么做?
x 标记没有 y 值。
除以下几行外,其他都保持不变:
...
# Change the colors of bars at the edges...
left = []
right = []
twentyfifth, seventyfifth = np.percentile(data, [25, 75])
for patch, rightside, leftside in zip(patches, bins[1:], bins[:-1]):
if rightside < twentyfifth:
patch.set_facecolor('green')
left.append(leftside)
elif leftside > seventyfifth:
patch.set_facecolor('red')
right.append(rightside)
ax.text(left[int(len(left)/2)], 1, 'orange\n x')
ax.text(right[0], 1, 'pineapple\n x')
ax.text((left[int(len(left)/2)] + right[0]) / 2, 1, 'apple\n x')
# Label the raw counts and the percentages below the x-axis...
bin_centers = 0.5 * np.diff(bins) + bins[:-1]
...
输出:
---编辑---
OP 添加了数据并要求编辑。
问题中OP的代码保持原样,后面添加以下行。
data = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'price': [2, 0.1, 2.4, 2.2, 1]}
ax.scatter(data['price'], [1]*len(data['price']), zorder=2, marker='x', c='k')
for i in range(len(data['price'])):
ax.text(data['price'][i]-0.2, 1.5, f"{data['product_name'][i]}")
输出:
注释重叠,但这是预期的,因为 OP 给出的 x 值(彼此非常接近)。
我目前正在使用这段代码绘制直方图。
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import FormatStrFormatter
data = np.random.randn(82)
fig, ax = plt.subplots()
counts, bins, patches = ax.hist(data, facecolor='yellow', edgecolor='gray')
# Set the ticks to be at the edges of the bins.
ax.set_xticks(bins)
# Set the xaxis's tick labels to be formatted with 1 decimal place...
ax.xaxis.set_major_formatter(FormatStrFormatter('%0.1f'))
# Change the colors of bars at the edges...
twentyfifth, seventyfifth = np.percentile(data, [25, 75])
for patch, rightside, leftside in zip(patches, bins[1:], bins[:-1]):
if rightside < twentyfifth:
patch.set_facecolor('green')
elif leftside > seventyfifth:
patch.set_facecolor('red')
# Label the raw counts and the percentages below the x-axis...
bin_centers = 0.5 * np.diff(bins) + bins[:-1]
for count, x in zip(counts, bin_centers):
# Label the raw counts
ax.annotate(str(count), xy=(x, 0), xycoords=('data', 'axes fraction'),
xytext=(0, -18), textcoords='offset points', va='top', ha='center')
# Label the percentages
percent = '%0.0f%%' % (100 * float(count) / counts.sum())
ax.annotate(percent, xy=(x, 0), xycoords=('data', 'axes fraction'),
xytext=(0, -32), textcoords='offset points', va='top', ha='center')
# Give ourselves some more room at the bottom of the plot
plt.subplots_adjust(bottom=0.15)
plt.show()
我想在直方图上添加给定直方图 x 轴值的 x 标记(标有“橙色”、“苹果”、“菠萝”),如图所示:
我应该怎么做?
x 标记没有 y 值。
除以下几行外,其他都保持不变:
...
# Change the colors of bars at the edges...
left = []
right = []
twentyfifth, seventyfifth = np.percentile(data, [25, 75])
for patch, rightside, leftside in zip(patches, bins[1:], bins[:-1]):
if rightside < twentyfifth:
patch.set_facecolor('green')
left.append(leftside)
elif leftside > seventyfifth:
patch.set_facecolor('red')
right.append(rightside)
ax.text(left[int(len(left)/2)], 1, 'orange\n x')
ax.text(right[0], 1, 'pineapple\n x')
ax.text((left[int(len(left)/2)] + right[0]) / 2, 1, 'apple\n x')
# Label the raw counts and the percentages below the x-axis...
bin_centers = 0.5 * np.diff(bins) + bins[:-1]
...
输出:
---编辑---
OP 添加了数据并要求编辑。
问题中OP的代码保持原样,后面添加以下行。
data = {'product_name': ['laptop', 'printer', 'tablet', 'desk', 'chair'],'price': [2, 0.1, 2.4, 2.2, 1]}
ax.scatter(data['price'], [1]*len(data['price']), zorder=2, marker='x', c='k')
for i in range(len(data['price'])):
ax.text(data['price'][i]-0.2, 1.5, f"{data['product_name'][i]}")
输出:
注释重叠,但这是预期的,因为 OP 给出的 x 值(彼此非常接近)。